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

C程序出现realloc(): invalid next size错误,求解决方法

解决你的C语言realloc崩溃问题

嘿,很高兴能帮到你!你遇到的realloc(): invalid next size错误,本质是内存越界写入破坏了malloc/realloc的内部管理结构——小数组时运气好没触发,但数组变大后,内存布局更紧凑,越界就直接触发错误了。咱们来一步步拆解问题并修复:

核心错误:运算符优先级踩坑

你的代码里有个非常隐蔽的优先级问题,这是导致崩溃的直接原因:

arr1 = (int*)realloc(arr1, i+1 * sizeof(int));

这里乘法*的优先级比加法+高,所以实际计算的是 i + (1 * sizeof(int)),而不是你想要的(i+1)*sizeof(int)!这意味着你每次分配的内存远小于实际需要的大小,写入arr1[i]时必然会越界,破坏了内存管理的元数据,大数组时就触发了realloc的错误提示。

同样的问题也出现在i+2 * sizeof(int)这里,必须加上括号修正。

其他需要优化的逻辑点

除了优先级问题,你的循环条件i < j通过动态调整j来控制,逻辑比较绕,容易出错。可以改成更直观的while(k >=0)循环,从倒数第二个元素开始,每次往前跳2个位置。

另外,你的函数声明是int checksum(...),但函数里没有任何return语句,这会导致未定义行为,建议补充返回值(比如新数组的长度,或者最终的校验和,取决于你的实际需求)。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

// 假设函数返回新数组的长度,同时通过指针参数返回新数组
int checksum(int *arr, int length, int **out_arr) {
    int *arr1 = NULL;
    int count = 0; // 记录新数组的元素个数
    int k = length - 2; // 从倒数第二个元素开始

    while (k >= 0) {
        int n = arr[k] * 2;
        if (n < 10) {
            // 分配一个元素的内存
            int *temp = realloc(arr1, (count + 1) * sizeof(int));
            if (temp == NULL) {
                // 内存分配失败,清理已分配的内存
                free(arr1);
                *out_arr = NULL;
                return -1;
            }
            arr1 = temp;
            arr1[count] = n;
            printf("%d", arr1[count]);
            count++;
        } else {
            // 分配两个元素的内存
            int *temp = realloc(arr1, (count + 2) * sizeof(int));
            if (temp == NULL) {
                free(arr1);
                *out_arr = NULL;
                return -1;
            }
            arr1 = temp;
            arr1[count] = n / 10;
            arr1[count + 1] = n % 10;
            printf("%d%d", arr1[count], arr1[count + 1]);
            count += 2;
        }
        k -= 2; // 往前跳两个元素
    }

    *out_arr = arr1;
    return count; // 返回新数组的元素个数
}

// 测试用例
int main() {
    int arr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    int len = sizeof(arr)/sizeof(arr[0]);
    int *result = NULL;
    int result_len = checksum(arr, len, &result);

    if (result_len != -1) {
        printf("\n新数组长度:%d\n", result_len);
        // 使用完记得释放内存
        free(result);
    } else {
        printf("内存分配失败\n");
    }
    return 0;
}

关键修正说明

  • 修复了realloc时的运算符优先级问题,用括号明确(count + N)*sizeof(int)的计算顺序
  • 改用while(k >=0)循环,逻辑更清晰,避免了原代码中i和j互相调整的混乱
  • 增加了内存分配失败的错误处理,避免内存泄漏
  • 通过指针参数返回新数组,函数返回新数组的长度,更符合C语言的使用习惯
  • 补充了测试用例,方便你验证大数组的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:35:36