如何在数组中间realloc()?

时间:2012-01-30 20:47:45

标签: c malloc realloc

我有一个指针数组

    char *wordlist[9];

然后我malloc()在每个指针上都有一块内存

for(int i=0; i<9; i++)
    wordList[i] = (char*)malloc(someLength);

让我们假设每次someLength都不同。

问题是现在,我想realloc()ie。 wordList的第四个elemet比现在更大。

wordList[3] = (char*) realloc(&wordList[3], someBiggerSize);

由于malloc分配了一致的内存块,那么该操作是否可能不会与wordList [4]发生冲突?

6 个答案:

答案 0 :(得分:1)

原则上没有什么可担心的。你只有一个指针数组,数组的每个元素都指向一个不同的内存块。因此,可以独立于其他元素重新分配数组的每个元素,每个指针。

现在,我原则上说因为您的代码确实有错误。您应该将wordList[3]而不是&wordList[3]传递给realloc

答案 1 :(得分:1)

为什么要碰撞?您已经声明了一个指针数组,每个指针都指向在别处分配的内存。当你重新分配时,你只是改变了这个内存的大小/位置,realloc返回的指针就像它一样大。

顺便说一下,你不应该那样使用realloc,因为如果它失败了,你就会泄漏记忆;见例如here

--- ---编辑

并且,正如@asaelr所说,您应该删除&,只删除realloc指向的wordList[3]块,而不是wordList的内存。

答案 2 :(得分:1)

只需删除&即可。 wordList[3] = (char*) realloc(wordList[3], someBiggerSize);

wordList[3]是一个指针,realloc期望得到一个由malloc分配的指针。不指向它。

关于你的上一个问题:每次调用malloc时,它都会返回一致的内存块。无法保证由malloc的两次调用分配的内存将保持一致。换句话说,wordList[3]wordList[4]不一定是一致的,你可以做任何你想做的事情(只要你关心缓冲区大小)而不考虑另一个。 / p>

答案 3 :(得分:0)

每个指针都指向一个独立且独立的内存块。在你的指针数组中,每个元素只是一个地址,覆盖一个不会影响其他元素。所以,你正在做的很好,不会导致数组的其他元素出现任何问题。正如其他人所提到的,您应该通过wordList[3]而不是&wordList[3]

答案 4 :(得分:0)

您对realloc的作用有误解。它将返回一个全新的内存块(如果新的大小大于旧的大小),而不是增加传入其中的块的大小。

答案 5 :(得分:0)

malloc从堆中分配一个内存树干,并且在释放它们之前,不能为其他malloc分配内存中继。换句话说,只有在堆中有足够的连续可用空间时,malloc才会成功。因此,这可以确保分配的内存不会与您的单词中的任何其他内容发生冲突。