[March , 15, 2008] Watcom C 的笔记10 Watcom C (10)

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注