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

C语言调用realloc()函数时程序直接终止问题求助

问题根因

代码运行崩溃的核心原因是realloc()函数的参数顺序传反,直接触发非法内存访问异常。
realloc的标准函数原型如下:

void *realloc(void *ptr, size_t new_size);

第一个参数必须是之前malloc/calloc/realloc返回的合法堆内存指针,第二个参数才是调整后的新内存总字节数。你写的代码中把数值类型的arrSize作为第一个参数传入,相当于让系统去一个完全非法的内存地址上做内存调整操作,程序会直接触发段错误终止。


其他需要修复的代码隐患
  • 内存分配失败的处理逻辑不完整:calloc、realloc返回NULL时仅打印错误提示就继续执行后续逻辑,后续访问空指针同样会导致崩溃,分配失败后应该直接终止程序,不要继续走后续数组访问逻辑。
  • 新增元素数量未做合法性校验:如果用户输入负数,arrSize += modSize会因为arrSize是无符号size_t类型,得到一个远大于预期的错误值,后续内存分配、数组访问都会出现越界问题。
  • 直接把realloc返回值赋值给原数组指针存在内存泄漏风险:如果realloc分配失败返回NULL,原指针arr指向的合法内存地址会被覆盖丢失,这部分内存就无法被正常释放。正确写法是先用临时指针接收realloc的返回值,确认分配成功后再赋值给原数组指针。

修正后的可运行代码
#include <stdio.h>
#include <stdlib.h>

int* arr;
size_t arrSize = 10;

int main(){
    int modSize;
    printf("The Program is making a dynamic array\n");
    arr = calloc(arrSize, sizeof(int));
    if(arr == NULL){
        printf("error from calloc\n");
        return 1;
    }
    printf("Enter Values for the Array: \n");
    for(int i=0; i<arrSize; ++i){
        scanf("%d", &arr[i]);
    }

    printf("Would you like to add more values? If yes type the amount : ");
    scanf("%d", &modSize);
    // 校验新增元素数量合法性
    if(modSize < 0){
        printf("invalid add count\n");
        free(arr);
        return 1;
    }

    size_t newSize = arrSize + modSize;
    // 临时指针接收返回值,避免原指针被覆盖导致内存泄漏
    int* tempArr = realloc(arr, newSize * sizeof(int));
    if(tempArr == NULL){
        printf("error from realloc\n");
        free(arr);
        return 1;
    }
    arr = tempArr;
    arrSize = newSize;

    for(int i = 10; i<arrSize; ++i){
        scanf("%d", &arr[i]);
    }

    for(int i = 0; i<arrSize; ++i){
        printf("%d\t", arr[i]);
    }

    free(arr);
    return 0;
}

内容的提问来源于stack exchange,提问作者roverrr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:21:17