C语言内存分配问题:自定义函数分配内存无输出无报错,main中分配正常
问题原因
C语言的函数参数默认采用值传递规则,allocateMem函数的形参int *a是外层实参ptr的临时拷贝,函数内部对a的赋值仅会修改这个临时变量存储的地址值,完全不会影响main函数中ptr本身的取值。
调用allocateMem结束后,ptr仍然是未初始化的野指针,后续对ptr[0]、ptr[1]的写入、printf输出、free释放操作都属于访问非法内存的未定义行为,会出现无输出、无报错、崩溃等随机异常表现。
修复方案
有两种常用的修复方式:
方案1:让内存分配函数返回申请到的指针
#include <stdio.h> #include <stdlib.h> int* allocateMem() { return (int*)malloc(5 * sizeof(int)); } int main() { int *ptr = allocateMem(); // 必须判断内存分配是否成功 if (ptr == NULL) { perror("内存分配失败"); return 1; } ptr[0] = 5454; ptr[1] = 54; printf("Hi %d\n", ptr[1]); free(ptr); return 0; }
方案2:传入二级指针修改外层一级指针的取值
#include <stdio.h> #include <stdlib.h> void allocateMem(int **a) { *a = (int*)malloc(5 * sizeof(int)); } int main() { int *ptr; allocateMem(&ptr); // 必须判断内存分配是否成功 if (ptr == NULL) { perror("内存分配失败"); return 1; } ptr[0] = 5454; ptr[1] = 54; printf("Hi %d\n", ptr[1]); free(ptr); return 0; }
- 两种方案都建议新增动态内存分配的返回值校验,避免分配失败后访问空指针引发额外异常。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

