関数内で (構造体の) 配列を宣言すると、メモリは戻り後に自動的に解放されますか? それとも手動で解放する必要がありますか?
mezo pre_tabla[8][8]
定義 内部関数は、関数スコープが終了するとすぐにクリアされるスタック内のメモリを提供します。動的メモリ割り当てを使用するには、別の解放呼び出しが必要になります。
配列を静的に宣言する場合は、手動で解放する必要はありません。ただし、(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
すべてのローカル変数/構造体はスタックに割り当てられます。
関数に入ると、スタック ポインターがあり、データの格納に使用されるアドレスがそれに関連付けられます。
関数から戻ると、呼び出し元の関数に対応するようにスタック ポインタが更新されるため、メモリは自動的に解放されると言えます。
+----------+
| |
| 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]|
+----------+
配列が宣言されていないstatic
場合、プログラムが配列が宣言されているスコープから外れたときにメモリを解放する必要があります。