2013-08-22 3 views
0

Когда я объявляю массив (структур) внутри функции, освобождается ли память автоматически после возврата или я должен освобождать ее вручную?C: Массив, объявленный внутри функции

mezo pre_tabla[8][8] 
+2

Вы не выделили. Так что вам нечего освобождать. Кто бы это ни сделал, он позаботится и о последствиях: P –

+1

Если вы не использовали 'malloc()' или аналогичный вызов, вам не нужно использовать 'free()'. Времена, чтобы устать от этого - при вызове кода (например, в библиотеке), который выполняет выделение, которое не является очевидным; прочитайте документацию по вызовам библиотеки, чтобы узнать свои требования. – mah

ответ

1

Если вы объявляете массив статически, вам не нужно освобождать его вручную. Но если вы распределите массив динамически (используя malloc() или calloc()), вам нужно освободить его вручную. Для экс -

статического объявления ниже:

struct info { 
    char p; 
    int x; 
}; 

struct info arr[10]; // doesn't require to free it. 

динамического распределения ниже:

struct info *c; 

c = malloc(sizeof(info) * 10); // dynamic memory allocation, needs to be freed via free() system call 
2

Определения Внутри функции даст память в стеке, который будет очищен, как только область видимости функции будет die.Using динамического распределения памяти потребуется отдельный бесплатный звонок.

1

Если массив не объявлен как static память должна быть освобождена, когда программа выходит из области видимости, в которой массив объявляется.

+2

И если он _is_ объявлен как статический, по-прежнему нечего освобождать вручную, за каждый отправленный вопрос. – mah

+0

Да, вы правы. Невозможно удалить статическую переменную вручную. Я имею в виду, что статическая переменная останется в стеке после возврата функции – Max

1

Все локальные переменные/структуры распределены в стеке.

Когда вы вводите функцию, у вас есть указатель стека и адреса, которые используются для хранения данных, связаны с ним.

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

+----------+ 
|   | 
| f1 var1 |<--- f1() stack pointer 
| f1 var2 | 
| f1 arr[0]| 
| ..... | 
| f1 arr[N]| 
| f2 var1 |<--- f2() stack pointer 
| f2 var2 | 
| f1 arr[0]| 
| ..... | 
| f1 arr[N]| 
+----------+ 
Смежные вопросы