
free()の使いかたがよくわかりません。struct_createで次のように確保した領域を解放するのに、『free(s);』だけではダメだということですが、どうしてダメなのか、そしてどうしたらいいのかがわかりません。初心者なので詳しく教えていただけるとありがたいです。
#include<stdlib.h>
struct cell{
struct cell *next;
int datum;
};
struct stack{
struct cell *head;
};
struct stack *
stack_create()
{
struct stack *s;
s=malloc(sizeof(struct stack));
s->head=NULL;
return s;
}
void
stack_free(struct stack *s)
{
free(s);
}
No.2ベストアンサー
- 回答日時:
この質問のデータ構造ですと、struct stackは線形リストを構成しています。
struct stack型の1つのスタックは、先頭のcellのアドレスを指定するだけで、
中身は別途cellという形で別途メモリ確保し、数珠繋ぎに繋がれます。
言い換えると、struct stackは箱で、その中に実際の中身であるstruct cellが
数珠繋ぎに入れられます。
ですので、stack_free()するときには、
・s->headがNULLでなければ、s->head->next->next ・・・ とたどって行った
末尾のcellから順に、cellが0になるまで(s->headがNULLになるまで)メモリ解放していく
・free(s)を実施
という手順になります。
つまり、free(s)だけでは箱を開放しただけで、中身(cell)はアクセス
できなくなるだけで、メモリ解放されていません。
ANo.1は残念ながら、
stack_free(s->head);
で引数の型が合わず、コンパイルエラーになるはずです。

No.1
- 回答日時:
このコードの範囲だけであれば、これでOKです。
ただ、このコードの範囲だけでは、スタックとして用をなさないでしょう。
スタックですから、データをどんどんプッシュして使うはずですが、そのように、データをプッシュした状態だと、単に free(s) では、データ1個分(ここでは、struct cell 1個)のメモリが解放されるだけで、それにつながっているデータは解放されずに残ってしまいます。
この構造だと、リンクリストでスタックを実現しようとしていますから、与えられた場所以降につながっているリンクリストを順次解放する必要があります。
void stack_free(staruct stack *s)
{
if (s->head != NULL)
{
stack_free(s->head);
// 与えられた場所以降に何かつながっていれば、 s->head つまり、これにつながっている部分以降を全部解放してから、
}
free(s);
// 先頭を解放して終わり
}
こんな感じで行けると思います(未確認)
いずれにしても、リンクリストの取り扱いや、(この場合なら)関数の再帰的な呼び出しといった部分の理解が必要になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual Basic Net2003
-
ファイルマッピング関数で失敗
-
メモリが不足しています(VBA)
-
free()について
-
PC-98で拡張メモリを使え...
-
COMについて
-
取ってこれないメモリのはずのm...
-
直接メモリにアドレス割付けで...
-
メモリの使用量
-
論理アドレスの割り当て方法
-
DirectX9関数「D3DXCreateTextu...
-
大容量のメモリ確保をスワップ...
-
メモリの解放について VB6 VBA
-
C#、VB.NET、C++.NETでのメモリ...
-
C#のガベージコレクタについて
-
Segmentation fault
-
C/C++言語のメモリについて
-
メモリの中身(サイズ)を知る
-
gccで割当可能メモリ領域を取得...
-
【C言語】再帰が時間がかかる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
ExitProcessの関数コールについ...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルVBA 大容量CSVファイル...
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
Bitmapを重ね合わせる方法
-
ルネサスマイコン(R8C) ビルド...
-
C,C++プログラムの強制終了時の...
-
C言語:関数のメモリ上でのサイ...
おすすめ情報