读书人

内存分配有关问题GetMemory函数

发布时间: 2012-03-09 16:54:57 作者: rapoo

内存分配问题,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;  } 

读书人网 >C语言

热点推荐