Как сделать realloc () в середине массива? - PullRequest
0 голосов
/ 31 января 2012

У меня есть массив указателей

    char *wordlist[9];

и затем я malloc () блок памяти на каждом из этих указателей

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

Предположим, что каждый раз someLength отличается.

И проблема в том, что я хочу realloc () т.е. 4-й элемент WordList в большем размере, чем сейчас.

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

Поскольку malloc выделяет согласованный блок памяти, возможна ли эта операция даже без конфликта с wordList [4]?

Ответы [ 6 ]

1 голос
/ 31 января 2012

Просто удалите &.wordList[3] = (char*) realloc(wordList[3], someBiggerSize);

wordList[3] - это указатель, и realloc ожидает получить указатель, выделенный malloc.не указатель на него.

О вашем последнем вопросе: каждый раз, когда вы вызываете malloc, он возвращает согласованный блок памяти.нет гарантии, что память, выделенная двумя вызовами для malloc, будет согласованной.Другими словами, wordList[3] и wordList[4] не обязательно должны быть согласованными, и вы можете делать что угодно, два из них (если вы заботитесь о размере буферов), не думая о другом.

1 голос
/ 31 января 2012

Почему оно должно сталкиваться? Вы объявили массив указателей, каждый из которых указывает на память, выделенную в другом месте. Когда вы перераспределяете, вы просто изменяете размер / положение этой памяти, указатель, возвращаемый realloc, такой же большой, как был.

Кстати, вы не должны использовать realloc таким образом, так как, если это не удастся, у вас будет утечка памяти; см. например здесь .

--- редактировать ---

И, как заметил @asaelr, вы должны удалить этот &, просто realloc, в блоке, указанном wordList[3], а не в памяти wordList.

1 голос
/ 31 января 2012

В принципе нечего беспокоиться об этом. У вас просто есть массив указателей, и каждый элемент массива указывает на отдельный блок памяти. Поэтому каждый элемент массива, каждый указатель может быть перераспределен независимо от других элементов.

Теперь я говорю в принципе, потому что в вашем коде есть ошибка. Вы должны передать wordList[3] вместо &wordList[3] на realloc.

0 голосов
/ 31 января 2012

malloc выделяет ствол памяти из кучи, и этот ствол памяти не может быть выделен для других malloc, пока вы не освободите их. Другими словами, malloc преуспевает, только если в куче достаточно непрерывного свободного пространства. Таким образом, это гарантирует, что выделенная память не будет конфликтовать с любыми другими в ваших словах.

0 голосов
/ 31 января 2012

Вы неправильно понимаете, что делает realloc. Он вернет целый новый блок памяти (если новый размер больше старого) вместо увеличения размера переданного в него блока.

0 голосов
/ 31 января 2012

Каждый из ваших указателей указывает на отдельный и независимый блок памяти.Внутри вашего массива указателей каждый элемент является просто адресом, и перезапись одного не повлияет на остальные.Итак, то, что вы делаете, хорошо и не вызовет никаких проблем с другими элементами массива.Как уже упоминалось, вы должны проходить wordList[3], а не &wordList[3]

...