第一:请问运行Test 函数会有什么样的结果?
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void){
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
【Jacob】 程序崩溃,str是一个指针,它的值是NULL,GetMemory 中p的初始值为空,P是保存在栈上,然后p的值有效,调用函数结束后p的值
消失。str的值依然是NULL,所以崩溃。假设str的地址是0x...1234,这个地址的值为NULL,函数传递参数是按值传递,p在栈上,
假设地址是0x...4567,地址里面的值是NULL.调用malloc后,地址0x...4567中的值是有效的地址值。函数调用后,0x...1234中的值没有改变还是
NULL;0x...4567的值无效,可能是正确的分配得到的内存的值,也可能是乱码。所以崩溃。应该用指向指针的指针。
第二:请问运行Test 函数会有什么样的结果?
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
【jacob】
乱码.p是一个数组,这个数组在栈上。char p[] = "hello world"; 栈上的p的数组有效的值"hello world".
然后函数调用结束,把数组的起始地址传给str,str的地址有效,内容无效,函数调用完栈清空。这个地址就是一个无效的地址
如果有别的栈正好也用了刚才清空的栈所分配的内存。防伪这个地址的内容就不知道是什么东西了。
第三:请问运行Test 函数会有什么样的结果?
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
【Jacob】能正确输出"hello",内存泄漏。
第四:请问运行Test 函数会有什么样的结果?
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
【Jacob】
有可能产生堆破坏。free完之后应该str = NULL;