使用realloc()从函数扩容数组时触发段错误,求修复方法
修复动态扩容数组时的Segmentation Fault问题
我尝试实现输入偶数时通过调用函数使用realloc()动态扩容数组,但无论输入任何数字,编译器都会触发Segmentation Fault(段错误)。以下是我的代码:
#include <stdio.h> #include <stdlib.h> int MakeArray(int n,int *ptr) { ptr = (int*) malloc(n*sizeof(int)); if(ptr==NULL) { puts("Allocation failed"); } return *ptr; } int ReAllocArray(int n,int *ptr) { ptr = (int*) realloc(ptr,n*sizeof(int)); if(ptr==NULL) { puts("Reallocation failed"); } return *ptr; } int main() { int n; int *ptr=NULL; puts("Enter size of n"); scanf("%d",&n); MakeArray(n,ptr); puts("Entering even number is increasing the size of the array by 1"); for(int i =0;i<n;++i) { scanf("%d",&ptr[i]); if(ptr[i]%2==0) { ++n; ReAllocArray(n,ptr); } } puts("Your array is:"); for(int i =0;i<n;i++) { printf("%d",ptr[i]); } return 0; }
问题根源
- 指针值传递导致地址丢失:
MakeArray和ReAllocArray中的ptr是函数局部变量,函数内用malloc/realloc分配的内存地址仅存在于函数内部,不会同步到main的ptr。main里的ptr始终为NULL,访问ptr[i]直接触发段错误。 - 无意义的返回值:返回
*ptr既没传递有效地址,还可能在分配失败时访问空指针引发崩溃。 - 缺失错误处理逻辑:分配失败仅打印提示却继续执行,会导致未定义行为。
修复后的代码
#include <stdio.h> #include <stdlib.h> // 返回分配后的指针地址 int* MakeArray(int n) { int *ptr = (int*) malloc(n * sizeof(int)); if (ptr == NULL) { puts("Allocation failed"); exit(EXIT_FAILURE); // 分配失败直接终止程序 } return ptr; } // 返回重新分配后的指针地址 int* ReAllocArray(int n, int *ptr) { int *new_ptr = (int*) realloc(ptr, n * sizeof(int)); if (new_ptr == NULL) { puts("Reallocation failed"); free(ptr); // 避免内存泄漏 exit(EXIT_FAILURE); } return new_ptr; } int main() { int n; int *ptr = NULL; puts("Enter size of n"); scanf("%d", &n); // 接收分配后的指针 ptr = MakeArray(n); puts("Entering even number is increasing the size of the array by 1"); for (int i = 0; i < n; ++i) { scanf("%d", &ptr[i]); if (ptr[i] % 2 == 0) { ++n; // 接收扩容后的新指针 ptr = ReAllocArray(n, ptr); } } puts("Your array is:"); for (int i = 0; i < n; i++) { printf("%d ", ptr[i]); // 加空格优化输出可读性 } free(ptr); // 释放动态内存,避免泄漏 return 0; }
关键修复点
- 调整函数返回值:让分配/扩容函数返回
int*类型,将新内存地址传递回main。 - 完善错误处理:分配失败直接终止程序,
realloc失败时先释放原有内存防止泄漏。 - 更新主函数指针:每次调用分配/扩容函数后,将返回的新地址赋值给
ptr,确保操作正确内存区域。 - 添加内存释放:程序结束前释放动态分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者user20082734
相关产品推荐
相关产品推荐

