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

Visual Studio中realloc函数分配第二个元素失败问题求助

问题排查与修复

你的代码核心问题出在realloc的内存分配大小上:每次调用realloc时,你只分配了单个int的内存空间,但随着n递增,你需要为n+1个int元素分配内存,否则会出现内存越界访问,导致第二个及后续元素无法正常存储(本质是越界写入了不属于你的内存区域,属于未定义行为)。

具体错误点

feld = realloc(feld, sizeof(int));

这行代码每次只分配sizeof(int)字节(通常是4字节),只能容纳1个int元素。当n=1时,你尝试写入*(feld + 1),这已经超出了分配的内存范围,触发未定义行为。

修复后的代码

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

int main() {
    int max, value, n = 0;
    int* feld = NULL;
    printf("enter max: ");
    scanf("%d", &max);
    
    do {
        printf("\nenter value: ");
        scanf("%d", &value);
        if (value >= 0) {
            // 分配n+1个int的内存空间
            int* temp = realloc(feld, (n + 1) * sizeof(int));
            // 检查realloc是否成功,避免内存泄漏
            if (temp == NULL) {
                perror("realloc failed");
                free(feld);
                return 1;
            }
            feld = temp;
            feld[n] = value; // 用数组下标更直观
            n++;
        }
        else {
            break;
        }
    } while (n < max);
    
    for (int i = 0; i < n; i++) {
        printf("\n%d", feld[i]);
    }
    
    // 释放分配的内存,避免泄漏
    free(feld);
    return 0;
}

额外注意事项

  • 检查realloc返回值:realloc可能因为内存不足返回NULL,直接赋值给原指针会导致原来的内存地址丢失,造成内存泄漏。所以先把返回值存在临时变量里,检查成功后再赋值。
  • 最后释放内存:程序结束前要调用free(feld),避免内存泄漏。
  • 数组下标写法:feld[n]比*(feld + n)更直观,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:02:40