下面的代碼偶爾在buffer = (char*) realloc(buffer, allocated * sizeof(char));
調用(下面標記爲)時會失敗,我通過最初分配1個字符來動態分配char*
的空間,並且每次將分配量加倍我已經擁有的內存不足以存儲字符串。realloc僅在未調試時多次調用後纔會失敗
我在我的項目的許多其他部分有非常相似的代碼,具有相同的內存分配策略和調用(僅更改void*
的類型,我傳遞給realloc
)。
我使用VS2010來調試問題,並且當我在調試模式下啓動程序時,該函數總是成功完成。
但是,從命令行調用程序時,很有可能在一段時間後出現「訪問衝突讀取位置」錯誤後,其中一個調用realloc的調用將失敗 - 儘管它不會發生所有時間,只有在多次調用下面的函數之後纔會發生,並且已經發生了許多重新分配。
什麼是weirder,我在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分配= 1;''被分配的size_t = 16;'? – alk
這就是我的猜測,要麼他確實想在第一輪中從16個字符減少到2個(這將是......奇怪的)。 – WhozCraig