=C语言=动态内存分配遇上函数-经典错误纠错
直接完整代码
1 |
|
分析
推测这段代码的的目的是通过GetMemory
函数申请内存,然后把返回的地址存入指针变量str
,再把字符串"hello world"
复制到str
所指向的内存中,最后printf
输出
逐步纠错
GetMemory
- 首先是传参错误。若在函数内修改外部的一级指针,不能直接将外部一级指针作为实参传入:因为函数会将实参赋给形参,程序运行到大括号外面后,形参被销毁,实参没有变化。所以应该使用
char** p
二级指针作为形参,储存地址时使用*p
\ - 其次是内存泄漏。开辟的内存的地址并没有传递给实参,形参又最后销毁了,同时没有释放内存,函数运行完后申请的内存无法找到,导致最终无法释放,造成内存泄漏
1 | //更合适的代码 |
Test
- NULL的大问题。假设
malloc
返回的地址已经存入str
,但任然缺少对空指针的判断,导致strcmp
中传入了空指针->报错;printf
中传入空指针->报错 - 没有释放内存->内存泄漏。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//更适合的代码
void Test()
{
char* str = NULL;
GetMemory(str);
if(str == MULL)
{
return;
}
strcpy(str,"hello world");
printf("%s\n",str);
free(str); //防止内存泄漏
str = NULL; //清除野指针
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 supdriver的博客!
评论