gpt4 book ai didi

c - 对于指向数组的指针,realloc 失败(在 C 中)

转载 作者:行者123 更新时间:2023-11-30 14:24:13 25 4
gpt4 key购买 nike

我正在尝试为(本质上是)二维字符数组(即字符串数组)动态分配内存。

我的代码如下:

typedef char LineType[MAX_CHARS+1];
LineType* lines;

int c = 0;
int N = 2;

lines = (LineType *) malloc (N * sizeof( LineType) );
do {
if (c > N ) {
N *=2;
lines = (LineType*) realloc (lines, N * sizeof( LineType));
}

.
.
.
c++;

} while ( . . . )

编译正常,但在运行时失败,给出有关可能的 HEAP CORRUPTION 的警告并在 dbgheap.c 处中断(位于:_CrtIsValidHeapPointer)

我做错了什么?我认为这可能是由于数据结构中固定/动态维度的混合...但是,为字符串数组(不同大小)声明然后动态分配(和重新分配)内存的最佳方法是什么(每个都有固定的大小)?

提前非常感谢

更新2012年8月26日

我对代码做了一些修改,以适应人们的评论和建议。问题仍然存在...

最佳答案

假设 c 用于索引 lines,您需要测试 c >= N,而不是 c > N .

顺便说一句,我建议使用 typedef 来使代码更具可读性。我还会避免冗余分配代码:

typedef char fixed_string[MAX_CHARS + 1];

int c = 0;
int N = 0;
fixed_string *lines = NULL;

do {
if (c >= N ) {
N = N ? 2*N : 2;
lines = (fixed_string*) realloc (lines, N * sizeof(fixed_string));
}

c++;
} while (…);

另外,使用 2 的增长因子时要小心。它会留下无法由同一阵列重复使用的孔。系数 1.5 (3*N/2) 更安全。

编辑:我从其他评论中注意到,您在重新分配时遇到了崩溃。这与越过数组末尾进行写入是一致的。调试内存分配器将用特殊字节填充已分配内存块周围的空间,并在下次对该内存块执行某些操作时检查是否保留了这些字节。 HEAP CORRUPTION 消息表明您已通过在指定内存之外进行写入而损坏了周围的字节。

关于c - 对于指向数组的指针,realloc 失败(在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12120836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com