Malloc в цикле, все ли блоки расположены последовательно?
У меня есть функция, в которой я использую локальный массив. Я хотел бы вернуть указатель на это, но, конечно, никто не может сделать это, если не будет выделять память вручную. Поэтому я хотел бы знать, если распределение так:
for(i = 0; i < 26; i++)
{
llist[i] = malloc(sizeof(SomeStruct));
}
может быть позже освобожден так:
// (where ptr is a pointer to the first allocation in llist)
for(i = 0; i < 26, i++)
{
free(ptr);
ptr += sizeof(SomeStruct);
}
Редактировать:
Кажется, я не могу этого сделать. Есть ли способ, которым я мог бы освободить всю память, учитывая только указатель на первый элемент? Или я должен полностью придерживаться другого подхода?
3 ответа
Нет, не может. Нет гарантии, что эти блоки будут расположены последовательно. На самом деле, они почти наверняка не со всеми современными реализациями, которые я видел. Большинство хранит размер блока и часто другую информацию непосредственно перед каждым блоком. Кроме того, если ваша память фрагментирована, блоки могут оказаться в любом месте свободного пространства между другими данными, где недостаточно места для их последовательного размещения.
Нет, ты не можешь. В первом пустом месте malloc
находит, что это может быть место только для одной структуры. Если это так, следующий блок будет размещен где-то еще.
Зависит от того, что вы делаете внутри цикла. Некоторые функции будут распределять буферы внутри, что означает, что malloc() может быть вызван за вашей спиной. В вашем простом цикле значения ДОЛЖНЫ быть последовательными. Кроме того, когда вы добавляете многопоточность, все ставки выходят за пределы окна, так как что-то в другом потоке может также испортить память.
Фактическое место выделения также зависит от того, насколько фрагментирована ваша память. Последовательных блоков может не хватить для обработки вашего запроса, поэтому фактическое выделение может быть из любого места в свободном пространстве.