2016-03-10 4 views
-2

Почему (правда эзотерическая) манипуляции Подчеркнутой причины следующей ошибки:Почему эта последовательность операций указателя вызывает ошибку?

*** Error in /home/ubuntu/workspace/Project 3/Debug/Project 3': double free or corruption (out): 0x00007fffffffd7c0 ***

int *intPointer = malloc(sizeof(int)); 
    *intPointer = 1; 
    int intArray[] = { *intPointer }; 
    int *intPointer2 = &intArray[0]; 
    free(intPointer2); 

ответ

8

Значение, присвоенное intPointer2 является указателем на первый элемент в intArray. Этот массив был выделен в стеке, поэтому попытка free - undefined behavior.

Вы можете только free память, которая была возвращена malloc/realloc/calloc. Тот факт, что первый (и единственный) элемент в этом массиве содержит копию , значение, на которое указывает intPointer (не копия значения intPointer), не имеет значения.

Работает только по телефону free(intPointer).

3

Вы передаете &intArray[0] в free, но вы не получили его от malloc, поэтому поведение не определено.

+0

Но я рассказываю целое число, которое я сделал malloc в массиве? – Adam

+0

Вы храните копию malloc'd int. Копия не является malloc'd. – emlai

+0

Если я сохранил 'intPointer' в массиве, а затем установил' intPointer2 = intArray [0] ', будет ли свободная функция' intPointer2' работать? – Adam

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