使用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
相关产品推荐
相关产品推荐

