void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
在函数内为p开辟内存空间,可是p出了函数就不存在了,为p开辟的内存空间不会销毁,也没有释放,不被free就不被销毁,内存泄漏。str在Test函数内仍为NULL,空指针。
2. 返回栈空间地址的问题char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
p出了函数就不存在,局部数组里放的值也不存在了,此时输出的str放的是随机值。
3.void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);//传址
strcpy(str, "hello");
printf(str);
free(str);
str=NULL;
}
int main()
{
Test();
return 0;
}
把str地址传给函数,形参只是实参的一份临时拷贝。传址,函数内部对形参修改,实参也被修改。
输出结果:
4.void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
输出结果:
注意:
虽然能输出,但此代码依旧有问题!
free str后,没有将str置为NULL,此时str为野指针。str已经被释放,使用则为非法访问内存。
给str分配了100个字节的空间,然后释放,把空间返回给系统,
空间还存在,使用权不属于str。
虽然能输出,因为空间里还放着hello,str的地址,
str依旧指向这个空间,但空间不是str的。
str不等于NULL,给str放入world,然后输出world,但是str已经被释放。非法访问内存
想想加上str = NULL;后题目4可以没有 if语句 吗?
不行!不能使用空指针,去掉后程序会崩溃,输出乱码。
如果对你有帮助,欢迎点赞+评论+收藏+关注~ 感谢!欢迎各位在评论区与博主友好交流!这些题都掌握了吗?



