C语言释放内存是否需要原指针?示例cleanProgram能否释放全部malloc内存
问题解答
1. C语言释放内存是否需要使用分配时返回的原始指针?
必须使用。C语言标准明确规定,free() 函数的入参只能是之前 malloc()/calloc()/realloc() 调用返回的原始指针值。如果对指针做了偏移修改、或者指针值被篡改后再传入 free(),会触发未定义行为,大概率导致程序崩溃、内存损坏等问题。
举个错误示例:
int *p = malloc(10 * sizeof(int)); p++; // 修改了分配时返回的原始指针值 free(p); // 属于错误用法,触发未定义行为
2. 给出的代码中cleanProgram()能否完全释放所有分配的内存?
可以完全释放,释放逻辑是完全正确的:
createArray()中一共执行了两次malloc()内存分配:- 第一次为
Array结构体分配内存,返回的原始指针存储在变量a中,最终作为返回值传递给main函数的变量a,后续传入cleanProgram()的参数就是这个原始指针 - 第二次为数组元素分配内存,返回的原始指针存储在
a->arr成员中,全程没有被修改过
- 第一次为
cleanProgram()的释放顺序也符合规范:先释放结构体内部的数组指针a->arr,再释放结构体本身的指针a,不存在内存泄漏。
额外说明:即使某次malloc()调用失败返回NULL,free(NULL)也是C标准明确允许的安全操作,不会触发运行错误。
内容的提问来源于stack exchange,提问作者031-Mohd Fahad
相关产品推荐
相关产品推荐

