关于C++中动态内存问题的一道题目

来源:百度知道 编辑:UC知道 时间:2024/07/07 23:42:03
林锐博士的《高质量C++/C 编程指南》中书后习题之一:
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,
Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩
溃。

我的问题是:不太理解为什么GetMemory 并不能传递动态内存,望各位大虾指教一二,谢谢!

关键在于GetMemory(char *p)使用指针参数p传递地址,而不是char *&,所以按照参数传递的“by value”语义,GetMemory内部使用的p和调用时传入的参数str不是一个对象,两者的关系仅仅在于“p和str的内容相同”(这里,就是两者指向的地址相同)。
但是GetMemory只是改变了p的内容,与str不相干!

你如果理解了指针的含义就会明白了,指针其实是一个长整型,他代表了内存的一个地址,通过这个长整型就能访问到存放在该地址中的变量

在理解了这点的基础上,将程序改写成这样

void GetMemory(long p)
{
p = (char *)malloc(100);
}

void Test(void)
{
long str = 0; //NULL其实就是代表0的宏
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}

你会看到str的值其实从头到尾没有变过,指向0地址

而0地址是不允许你写的,所以程序会崩溃

解决方法书上有说,你慢慢翻会看到的

-------------------------------------------
当然,现在内存越来越大,有些指针并不是长整型了,而是双字,或者更大的类型

标苦运先说正确了.
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
中:指针p是一个局部变量,你让它指向100个char内存的首地址,函数退出后,p销毁,而且实际参数str根本跟p不是一个东西,因为你是传值(虽然表面看起来是指针)调用函数,然后这段内存就无法操作了,导致内存泄漏.
strcpy(str, "hello world");
因为你的str=NULL;
即被视为没有指向任何