【问题标题】:How to realloc() in the middle of an array?如何在数组中间重新分配()?
【发布时间】:2012-02-22 15:23:38
【问题描述】:

我有一个指针数组

    char *wordlist[9];

然后我 malloc() 每个指针上的一块内存

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

假设每次 someLength 都不同。

现在的问题是,我想要 realloc() 即。 wordList 的第 4 个元素比现在更大。

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

既然 malloc 分配了一个一致的内存块,那么在不与 wordList[4] 冲突的情况下,该操作是否可行?

【问题讨论】:

    标签: c malloc realloc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      为什么会发生碰撞?您已经声明了一个指针数组,每个指针都指向在别处分配的内存。当您重新分配时,您只是在更改此内存的大小/位置,realloc 返回的指针与原来一样大。

      顺便说一句,你不应该那样使用realloc,因为如果它失败了,你就会泄漏内存;参见例如here.

      ---编辑---

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-07-15
                • 2017-06-28
                • 2012-06-17
                • 1970-01-01
                • 2020-07-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多