2012-01-30 32 views
0

我有指针如何在数组中间重新分配()?

char *wordlist[9]; 

和阵列然后我的malloc()的存储器上的每一个这种块指针

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

允许假设每次someLength是不同的。

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

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

由于malloc分配存储一致的块,是操作甚至可以不与单词表[4]碰撞?

回答

1

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

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

1

它为什么要碰撞?你已经声明了一个指针数组,每个指针指向其他地方分配的内存。当你重新分配你只是改变这个内存的大小/位置时,由realloc返回的指针就像它一样大。顺便说一下,你不应该这样使用realloc,因为如果失败了,你会漏出内存;见例如here

---编辑---

而且,作为@asaelr指出,你应该删除&,只是realloc荷兰国际集团通过wordList[3]指向的地块,wordList没有记忆。

1

只要删除&wordList[3] = (char*) realloc(wordList[3], someBiggerSize);

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

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

0

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

0

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

0

malloc从堆中分配一个内存中的内存,并且内存的中继不能被分配给其他malloc直到你释放它们。换句话说,只有在堆中有足够的连续可用空间时,malloc才会成功。所以这确保了分配的内存不会与你的话中的任何其他内容相冲突。