Run-Time Check Failure #2及内存释放访问违例问题排查求助
问题分析与修复方案
核心问题1:指针传值导致内存地址未正确更新
你的createTheArray函数使用了值传递的指针参数,函数内部array = calloc(...)仅修改了函数局部的指针变量,不会影响主函数中array的指向。主函数里的array始终指向最初calloc(1, sizeof(int))分配的仅1个int大小的内存块。当你输入的y大于1时,populateArray会越界写入内存,破坏堆结构,最终触发栈溢出检测错误和free时的访问违例。
核心问题2:内存分配失败的错误处理缺失
如果calloc返回NULL(内存分配失败),createTheArray没有返回有效数值,主函数中y会是未定义值,后续操作会引发更严重的错误。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> int createTheArray(int **array) { int y; printf("Enter the number of random numbers you wish to create and store: "); scanf_s("%i", &y); // 输入合法性检查,避免y为0或负数 if (y <= 0) { printf("Invalid number, must be positive\n"); return -1; } *array = (int *)calloc(y, sizeof(int)); if (*array == NULL) { printf("Out of memory\n"); return -1; } else { printf("Memory allocated \n"); return y; } } void populateArray(int* array, int y) { int x; for (x = 0; x < y; x++) { array[x] = rand() % 100; } for (x = 0; x < y; x++) { printf("array[%i]: %i\n", x, array[x]); } } void operateArray(int* array, int y) { int i, sum = 0, high = 0, low = array[0]; float average; for (i = 0; i < y; i++) { sum += array[i]; if (array[i] > high) high = array[i]; if (array[i] < low) low = array[i]; } average = (float)sum / y; printf("\n"); printf("Sum: %i \n", sum); printf("high: %i \n", high); printf("low: %i \n", low); printf("Average: %.1f \n", average); } int main() { int* array = NULL; int y = createTheArray(&array); // 检查内存分配是否成功 if (y == -1) { return 1; } populateArray(array, y); operateArray(array, y); free(array); return 0; }
关键修复点说明
- 将
createTheArray的参数改为int **array(指针的指针),这样函数内部可以直接修改主函数中指针的指向。 - 删除主函数中多余的
calloc(1, sizeof(int)),避免内存泄漏。 - 增加输入合法性检查,确保
y为正整数,避免后续数组访问越界。 - 为
createTheArray添加明确的错误返回值(-1),主函数中检查该值以处理内存分配失败的情况。 - 修正
main函数的标准写法为int main()。
内容的提问来源于stack exchange,提问作者Gomvi
相关产品推荐
相关产品推荐

