c++函数返回值来传递动态内存问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 16:35:16
下面这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不是局部变量,不是在栈内存中吗?

指针就是一个表示内存位置整型数。所以函数返回指针时,实际就是返回一个表示内存位置的整型数。
char p[] = "hello world"; 这一句运行时候,指针的数值指示的是 "hello world"的内存位置,一个是"hello world"临时局部变量,是在栈上分配的,这个指针的数值是这个栈分配的数值,应该何函数返回地址差不了多少, GetString函数返回的也是这个指针数值,因为栈内存会随意用作其他用途,比如说分配给其他函数变量使用邓,所以这个数值保存的数据会被覆盖是无意义的,这个地址仅仅是在GetString函数运行时才被初始化为hello world,GetString函数调用完了,这个地址很快就被用作其他用途。

而GetMemory3返回的也是一个内存地址(指针),但这个地址是通过char *p = (char *)malloc(sizeof(char) * num); 得来的。 malloc这个函数确保这个地址是一个全局地址而且不会用作其他用途,所以这个指针指向的地址是永远有效的,知道你用free这个函数提示系统我不需要这个内存了,那么系统才会用作其他用途。 malloc获取的地址(指针)就是有这个特点,至于为什么有这个特点,那是人家规定的!!

汗,写了这么多,就给点分吧!