2014-12-28 4 views
1

Я использую этот код для того, чтобы динамически выделять больше памяти в моем массиве Struct (mystructs), увеличивая размер size и перераспределять память:C распределение структура памяти с помощью перераспределить

int size = 1; 
MyStruct *mystructs = NULL; 
MyStruct *tmp = NULL; 
tmp = realloc(mystructs, sizeof(MyStruct) * size); 
mystructs = tmp; 

Мой вопрос заключается в том, что, даже если я использую size = 1, он по-прежнему выделяет больше памяти, чем необходимо для этого размера, потому что, когда я начинаю печатать значения struct с помощью printf(), я обычно могу распечатать несколько сотен элементов массива, хотя предполагается, что он содержит только один элемент , Распечатка означает вызов чего-то вроде: printf("%d", mystructs[i].value);. Почему значение i будет стоить около нескольких сотен, прежде чем он, наконец, будет segfaults, потому что я получил доступ к памяти, в которой я не должен был?

+5

Неопределенное поведение означает, что все может случиться – bolov

+0

Общая идиома заключается в том, чтобы использовать «malloc» в первую очередь. –

+0

Попробуйте использовать malloc, это будет то же самое. –

ответ

2

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

И иногда возникает ошибка сегментации.

Вот почему вы можете продолжать читать без проблем, и вдруг segmentation fault.

2

Возможность чтения памяти не означает, что вам разрешено это делать.

Возможно, как указывали другие, библиотека просто получает больше памяти от ОС, чем необходимо.

Но может случиться так, что он просто использует память, которая сидит до других частей памяти, используемых для чего-то еще.

Итак, даже если вы можете прочитать его, вы не должны, потому что вы никогда не знаете. И, самое главное: не пишите там - могут быть другие переменные, используемые вашей программой!

Смежные вопросы