【发布时间】:2013-08-20 15:13:11
【问题描述】:
下面的代码偶尔会在 buffer = (char*) realloc(buffer, allocated * sizeof(char)); 调用(在下面标记)上失败,我用它来为 char* 动态分配空间,最初分配 1 个字符,每次我已经拥有的内存时将分配的数量加倍不足以存储字符串。
我的项目的许多其他部分都有非常相似的代码,具有相同的内存分配策略和调用(仅更改我传递给realloc 的void* 的类型)。
我是用VS2010调试的问题,当我在调试模式下启动程序时,功能总是成功完成。
但是,当从命令行调用程序时,对 realloc 的调用很可能会在一段时间后失败并出现“访问冲突读取位置”错误 - 尽管它不会一直发生, 并且仅在多次调用下面的函数之后发生,并且已经发生了许多重新分配。
更奇怪的是,我在 realloc 调用之前和之后打印了一些内容,以断言指针位置是否已更改,当我这样做并运行程序时,对 realloc 的调用随机停止失败。
我做错了什么?
TOKEN
next_token_file(FILE* file,
STATE_MACHINE* sm,
STATE_MACHINE* wsssm)
{
char* buffer = (char*) malloc(sizeof(char));
size_t allocated = 1;
size_t i = 0;
while(1)
{
/*
... code that increments i by one and messes with sm a bit. Does nothing to the buffer.
*/
// XXX: This fails when using realloc. Why?
if(i + 1 >= allocated)
{
allocated = allocated << 1;
buffer = (char*) realloc(buffer, allocated * sizeof(char));
}
buffer[i] = sm->current_state->state;
/*
... more code that doesn't concern the buffer
*/
}
// Null-terminate string.
buffer[++i] = 0;
TOKEN t = {ret, buffer};
return t;
}
【问题讨论】:
-
这个
size_t allocated = 1;不应该是size_t allocated = 16;吗? -
这是我的猜测,或者他真的想在第一轮从 16 个字符减少到 2 个字符(这会……很奇怪)。
标签: c dynamic-memory-allocation