|
|
发表于 2005-7-11 19:44:42
|
显示全部楼层
c语言中的变量,归根结底可以分为以下几种:
存放在堆栈中的自动变量和函数参数;
来源于自由堆的动态分配(使用malloc,free对)以及静态分配的比如说一些常量.如果你研究过win32的PE格式文件的话,就可以知道程序从逻辑上分为初始化的数据段,未初始化的数据段,代码段,堆栈段.定义在函数内部的变量为局部变量,一般在堆栈上分配;而全局变量和常量则在自由堆中分配.
char *temp;
temp = "we are champion\n";
memset(temp, 0, strlen(temp));
如果将上一段代码放在一个函数内的话,在程序的全局数据段中有一个长度若干的连续存储区存放了字符串"we are champion\n",而char* tem则定义了在堆栈中通过调整堆栈顶部指针ESP的值来分配了一个四字节的存放地址的变量,赋值语句temp="we are cha.."调用的结果是将temp指向了一个常量存储区,当调用memset修改temp所指向存储区时,就会发生溢出错误.
第二段应该改成
char temp[100] = "we are champion\n";
或者是
char temp[100];
strcpy(temp, "we are champion\n");
memset(temp, 0, strlen(char) * 256);
第二部分,当char temp[100]是定义为全局字符数组时,内存的布局就是存在长度是100个字节未初始化的数据区,还有为"we are cha..."分配的初始化的数据区,而memset(temp, 0, strlen(char)*256)这部分我认为是错误的,编程时不应该对不是由你分配的存储空间进行写入操作,因此应该改成memset(temp, 0, strlen(temp) * size_of(char))来讲一片存储区全部初始化成0,使用256的话可能出现段异常.
可执行程序的逻辑结构可以通过编译器将c代码转换成汇编语言文件来理解. |
|