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