下面这2个方法可以重新给str分配内存char *GetMemory3(int num){char *p = (char *)malloc(sizeof(char) * num);return p;}void Test3(void){char *str = NULL;str = GetMemory3(100); strcpy(str, "hello");cout<< str << endl;free(str); }下面这2个却不能,说函数返回的是栈内存,将自动消亡!难道上面那个函数不是栈内存,不会自动消亡吗?char *GetString(void){char p[] = "hello world";return p; // 编译器将提出警告}void Test4(void){char *str = NULL;str = GetString(); // str 的内容是垃圾cout<< str << endl;}不是说函数的局部变量都是在栈内存中申请的吗?那么方法一中的 char *p不是局部变量,不是在栈内存中吗?
2 回答
湖上湖
TA贡献2003条经验 获得超2个赞
指针就是一个表示内存位置整型数。所以函数返回指针时,实际就是返回一个表示内存位置的整型数。
char p[] = "hello world"; 这一句运行时候,指针的数值指示的是 "hello world"的内存位置,一个是"hello world"临时局部变量,是在栈上分配的,这个指针的数值是这个栈分配的数值,应该何函数返回地址差不了多少, GetString函数返回的也是这个指针数值,因为栈内存会随意用作其他用途,比如说分配给其他函数变量使用邓,所以这个数值保存的数据会被覆盖是无意义的,这个地址仅仅是在GetString函数运行时才被初始化为hello world,GetString函数调用完了,这个地址很快就被用作其他用途。
而GetMemory3返回的也是一个内存地址(指针),但这个地址是通过char *p = (char *)malloc(sizeof(char) * num); 得来的。 malloc这个函数确保这个地址是一个全局地址而且不会用作其他用途,所以这个指针指向的地址是永远有效的,知道你用free这个函数提示系统我不需要这个内存了,那么系统才会用作其他用途。 malloc获取的地址(指针)就是有这个特点,至于为什么有这个特点,那是人家规定的!!
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报
0/150
提交
取消