第一题:下面程序运行的结果是?
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
答:程序崩溃。
因为 GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, “hello world”);将使程序崩溃。
指针变量传参,其实是创建了一个临时变量,让这个临时指针变量指向malloc申请的空间,但str依旧指向NULL,执行strcpy时程序会崩溃。还有就是p申请后要free释放,防止内存泄漏。
第二题:下面程序运行的结果是?
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char*str = NULL;
str = GetMemory();
printf(str);
}
答:可能是乱码。
因为 GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
第三题:下面程序运行的结果是?
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
解析:能够打印hello。这里是把指针变量的地址传过去,用二级指针变量接受,*p就相当于str。但是会发生内存泄漏。
第四题:下面程序运行的结果是?
void Test(void)
{
char*str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
解析:篡改动态内存区的内容,后果难以预料,非常危险。因为 free(str);之后,str 成为野指针,if(str != NULL)语句不起作用。