2014-10-26 6 views
-1

Я пытаюсь понять, что происходит, когда стек/кучу переменных смешиваются в C, например:Что происходит с переменными стека, если они переназначены malloc?

typedef struct E... 

void foo(E* param) { 
    param = malloc(sizeof(E)); 
} 

int main() { 
    E myParam; 
    foo(&myParam); 
    free(&myParam); //??? 
} 

Если запустить основной(), некоторые структура MyParam объявлена ​​на раме основного стека-х. Но затем foo() перенаправляет параметр в блок памяти кучи malloc'd. Что происходит с памятью стека, которая была выделена для myParam? Разве это «потеряно» и не изменится, даже если мы установим поля в myParam? И можем ли мы освободить память malloc'd, как в коде выше?

+1

'Foo()' 'установка param' не влияет на' myParam'. 'param' изначально является копией адреса' myParam'. 'free (& myParam)' плохо. – chux

ответ

3

Что происходит с памятью стека, которая была выделена для myParam?

Ничего.

Действительно ли это «растрачивается» и не изменится, даже если мы установим поля в myParam?

Нет, это не напрасно. Он изменится, если вы установите поля в myParam.

И можем ли мы освободить память malloc'd, как в коде выше?

Нет, вы не можете. Память, выделенная в foo, присваивается локальной переменной. Это утечка памяти. Вызов

free(&myParam); 

ведет к неопределенному поведению. &myParam не был выделен с использованием malloc (или его семейства функций). Это является причиной неопределенного поведения.

0

Я пытаюсь понять, что происходит, когда стек/кучу переменных смешиваются в C, например:

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

  1. Каждый компилятор
  2. Каждая реализация STDLIB (таНос кучи менеджера)
  3. Каждая программа и итерация

Одна реализация таНос/бесплатно может быть умным вороха, что проверяет действительность адресов, которые вы передаете в free(), чтобы убедиться, что они находятся в действительных «аренах» или областях кучи, перед выполнением каких-либо действий. Следующая реализация malloc может сделать предположение, что указатель, который вы передали бесплатно, был прав, а также доступ или набор скрытых значений для хранения кучи в адресе относительно переданного указателя. Поскольку указатель неверен, вы, по сути, пишете весь свой стек программ и, возможно, одновременно используете организацию кучи.

Нет стандартной реализации malloc/free, поэтому существует множество возможностей.

Адрес стека - это всего лишь значение для мусора, что касается free(), и если free() предполагает, что адрес находится в области кучи, которая была разделена системой приятелей, она будет обрабатывать ваш стек как его кучевые области, не что-то хорошее, ни что-либо, что будет иметь какой-либо смысл, с точки зрения эксперимента. не

не отличается от передачи недопустимого указателя на вызов к "Fread()" или "тетср()"

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