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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54