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

使用realloc遇异常:未获取到预期内存大小

问题解答

你混淆了指针的大小和分配的内存块大小这两个核心概念:

  • sizeof *fileContents 计算的是char*类型本身的大小,在32位系统下固定为4字节,64位系统是8字节——这和你用realloc分配的200字节内存完全无关。
  • C语言不会自动跟踪动态分配内存的容量,如果你需要知道当前内存块的大小,必须自己额外用变量来记录。

以下是修正后的代码示例,手动跟踪内存大小:

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

// 新增参数传递内存大小的记录变量
void loadFile(char **fileContents, size_t *currentSize) {
    printf("%p\n", *fileContents);
    // 用临时变量接收realloc返回值,避免分配失败时丢失原指针
    char *tempPtr = realloc(*fileContents, 200);
    if (tempPtr == NULL) {
        puts("realloc failed");
        return;
    }
    *fileContents = tempPtr;
    *currentSize = 200; // 更新记录的内存容量
    printf("%p\n", *fileContents);
    printf("当前分配的内存大小:%zu\n", *currentSize);
}

void menu() {
    size_t contentSize = 20;
    char *fileContents = malloc(contentSize);
    if (fileContents == NULL) {
        puts("memory failed to initialize");
        return;
    }

    loadFile(&fileContents, &contentSize);

    printf("当前内存大小记录:%zu\n", contentSize);

    free(fileContents);
}

int main() {
    menu();
    return 0;
}

额外补充两个关键注意事项:

  • 调用realloc必须用临时变量接收返回值:如果realloc分配失败会返回NULL,直接赋值给原指针会导致原来的内存地址丢失,引发内存泄漏。
  • 原代码中printf("%s\n", fileContents);会触发未定义行为:动态分配的内存是未初始化的,内部是随机垃圾值,%s要求字符串以'\0'结尾,直接打印会越界读取内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:10:58