内存分配问题,GetMemory函数
问题:char p[]="hello world";和 char *p="hello world";有什么差别?他们的内存是怎么分配的?请大虾们解释下下面程序。thank you!
- C/C++ code
#include <stdio.h> #include <stdlib.h> #include <string.h> char *GetMemory(void) { char p[]="hello world"; //用这句定义,则不会输出hello world // char *p="hello world"; //此句代替上面一行,则正确输出hello world return p; } void Test(void) { char *str=NULL; str=GetMemory(); printf("%s\n",str); } int main(void) { Test(); return 0; } [解决办法]
- C/C++ code
char p[]声明的数组是一个局部数组,在函数执行结束时就会销毁,所以该函数返回的也就是无效指针. char *p="hello world"p指向的是常量态存储区地址,所以尽管从函数返回了,但是常量存储区存储的字符串还是有效的,常量存储区要在程序结束的时候才释放!char *p="hello world的成功运行取决于编译器,如果编译器不把字符串常量放在常量存储区,那么同样不能正常工作.
[解决办法]
char p[]="hello world";
char *p="hello world";
第一个,p是字符型数组,内存使用的是栈空间,返回即可释放hello world。
第二个,p是字符串指针,指向堆空间的一个常量字符串。hello world会一直占用,无法释放。
[解决办法]
- C/C++ code
//为了便于讨论,原程序稍作修改#include <stdio.h> #include <stdlib.h> #include <string.h> char *GetMemory(void) { char p[]="hello world111"; //用这句定义,则不会输出hello world char *p2="hello world222"; //此句代替上面一行,则正确输出hello world // 以下部分有改动 int a; if(a % 2 == 1){ return p; } else{ return p2; } } void Test(void) { char *str=NULL; str=GetMemory(); printf("%s\n",str); } int main(void) { Test(); return 0; }