Watcom C 的笔记10 Watcom C (10)
局部变量在内存的位置
在编写一个com文件的时候,遇到奇怪的问题:编译正常,运行后显示
“Stack Overflow!”。程序片段如下:
#include <stdio.h>
int main(int argc,char *argv[])
{
int i,n;
FILE *f;
long int sum=0;
char buffer[2048]=; //1K 就在这里指定一个做buffer的变量
if (argc!=2) {printf("usage: checksum file
试验表明,如果在1024之上就会出现这个错误。在编译过程中,还发现
这个地方的大小不会影响生成com文件的大小。查阅资料【参考1】,上面说
局部变量存放在堆栈中... ...因此如果太大了自然会出现堆栈溢出的问题。
设置为全局变量就可以了,这样并不会影响生成文件的大小,看起来仍然是
在运行过程中动态分配的。分配在代码和堆栈之间的空间。具体如何确定,还不
清楚。
编译批处理文件 mkchk.bat
wcc checksum /ms
wlink system com file checksum
源程序:
#include <stdlib.h>
#include <stdio.h>
char buffer[0xC000]; //48K
int main(int argc,char *argv[])
{
int i,n;
FILE *f;
unsigned long int sum=0;
if (argc!=2) {printf("usage: checksum filename\n"); exit(1);};
//argv[0] is executable file name
f=fopen(argv[1],"r+b");
if (f==NULL) {printf("File open error!");}
n=fread(buffer,sizeof(char),sizeof(buffer),f);
while (n!=0)
{
for (i=0;i<n;i++)
{
sum=sum+buffer[i];
}
n=fread(buffer,sizeof(char),sizeof(buffer),f);
}
printf("Checksum in BYTE: %12hX\n",sum & 0xFF);
printf("Checksum in WORD: %12X\n", sum & 0xFFFF);
printf("Checksum in DWORD: %12lX\n",sum);
return 0;
}
运行结果:
G:\watcomc>checksum dos4gw.exe
Checksum in BYTE: 40
Checksum in WORD: 3E40
Checksum in DWORD: F0153E40
参考:
1.http://topic.csdn.net/t/20040316/12/2848204.html
2008-3-15
Zoologist