You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
}

问题根源

  1. 指针值传递导致地址丢失:MakeArray和ReAllocArray中的ptr是函数局部变量,函数内用malloc/realloc分配的内存地址仅存在于函数内部,不会同步到main的ptr。main里的ptr始终为NULL,访问ptr[i]直接触发段错误。
  2. 无意义的返回值:返回*ptr既没传递有效地址,还可能在分配失败时访问空指针引发崩溃。
  3. 缺失错误处理逻辑:分配失败仅打印提示却继续执行,会导致未定义行为。

修复后的代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:57:16