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
相关产品推荐
相关产品推荐

