C语言内存分配问题
http://www.diybl.com/course/3_program/c/c_js/2008611/124628.html
1、C中内存分为四个区
例子(一) int a = 0; //全局区 void main() { int b; //栈 char s[] = abc; //s在栈,abc在文字常量区 char *p1,*p2; //栈 char *p3 = “123456”; //123456在常量区,p3在栈上 static int c =0; //全局区 p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆 p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆 strcpy(p1, “123456”); //123456放在常量区 } 例子(二) //返回char型指针 char *f() { //s数组存放于栈上 char s[4] = {‘1′,’2′,’3′,’0’}; return s; //返回s数组的地址,但程序运行完s数组就被释放了 } void main() { char *s; s = f(); printf (%s, s); //打印出来乱码。因为s所指向地址已经没有数据 } 2、动态分配释放内存
NO.1 void GetMemory(char *p) void Test(void) NO.2 void Test(void) NO.3 void Test(void) NO.4 我对以上问题的分析: NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西. NO.3:正确答案为可以打印出hello.但内存泄漏了! NO.4:申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值.所以if语句永远都不能被执行.这也是著名的"野"指针问题.所以我们在编写程序释放一个指针之后一定要人为的将指针付成NULL.这样就会避免出现"野"指针的出现.有人说"野"指针很可怕,会带来意想不到的错误. |