我有一个指针数组
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]发生冲突?
答案 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才会成功。因此,这可以确保分配的内存不会与您的单词中的任何其他内容发生冲突。