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

未知大小整数数组动态扩容运行时错误排查与修复求助

问题分析与修复方案

咱们来拆解你的代码里导致运行时错误的几个关键问题:

1. 运算符优先级错误引发的非法内存访问

在create1DArray函数的else分支里,这句代码是崩溃的核心原因:

*perArray[i++]=x;

C语言中数组下标运算符[]的优先级高于解引用*,所以这句实际会被解析为*(perArray[i++])——但perArray是二级指针(指向int指针的指针),perArray[i]会去访问二级指针的第i个元素,这完全不是你要操作的数组元素位置,直接触发非法内存访问,循环执行2次后就会崩溃。

正确的写法应该是先解引用拿到数组的一级指针,再用下标访问:

(*perArray)[i++] = x;

2. 错误的内存释放对象

在所有错误处理分支里,你写了:

free(perArray);

perArray是传入的二级指针本身(它是main函数里&perArray的栈上副本),而真正需要释放的是动态分配的数组内存,也就是*perArray。释放错误的指针会导致未定义行为,甚至直接崩溃。

所有错误处理里的free都应该改成:

free(*perArray);

3. 初始内存分配的冗余与潜在风险

你一开始就malloc了1个int的空间,但后续第一次输入正数时,又会realloc成1*sizeof(int)(因为++(*size)从0变成1),这属于冗余操作。更合理的做法是初始把*perArray设为NULL,因为realloc(NULL, size)的效果等同于malloc(size),这样能简化代码逻辑。

另外,补充一个好习惯:不要直接把realloc的结果赋值给*perArray,如果realloc失败返回NULL,会导致原内存地址丢失,造成内存泄漏。应该先用临时指针接收realloc的结果,验证成功后再赋值。


修复后的完整代码

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

void create1DArray(int** perArray, int* size);

int main() {
    int *perArray = NULL, size = 0, i;
    create1DArray(&perArray, &size );
    
    for(i = 0; i < size; i++)
        printf("%d ", perArray[i]);
    
    free(perArray);
    return 0;
}

void create1DArray(int** perArray, int* size) {
    int flag = 0, i = 0, x;
    *perArray = NULL; // 初始化为NULL,让第一次realloc等同于malloc

    while(!flag) {
        // 先处理scanf输入失败的情况
        if(scanf("%d", &x) != 1) {
            printf("Invalid input!");
            free(*perArray);
            exit(1);
        }
        // 再判断输入是否为负数
        if(x < 0) {
            printf("Invalid input!");
            free(*perArray);
            exit(1);
        }
        // 输入0时退出循环
        if(x == 0) {
            if(*size == 0) {
                printf("The first element of the array must not be 0");
                free(*perArray);
                exit(1);
            }
            flag = 1;
        } else {
            // 先递增数组大小,再尝试扩容
            (*size)++;
            int* temp = realloc(*perArray, *size * sizeof(int));
            if(temp == NULL) {
                printf("Reallocation failed!");
                free(*perArray); // 释放原内存避免泄漏
                exit(1);
            }
            *perArray = temp;
            (*perArray)[i++] = x;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:04:59