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

