ページ 11

二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:02
by Cr
Crです
二次配列の動的取得をした後の開放の仕方が分かりません…

コード:

int d;
int i;
int **dis;

scanf("%d",&d);
dis = (int**)malloc(d);
for (i=0;i<d;i++){
       *dis[i]=malloc(d);
}
このあとfreeを使って解放せねばならないことは分かるのですが、二次配列の場合どうやって開放すべきなんでしょうか?
どなたか分かる方いたら教えてください。

Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:05
by box
確保したときとは逆の手順でfreeしてください。
ところで、
Cr さんが書きました:

コード:

dis = (int**)malloc(d);
       *dis[i]=malloc(d);
この2行に
sizeof(int *)
とか
sizeof(int)
とかが登場しなくていいんでしょうか。

Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:07
by Cr
えぇと逆というと、こんな感じですか?

コード:


for(i=0;i<d;i++){
        free(*dis[i]);
}

free(**dis);


Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:12
by Cr
sizeofの件、見逃してました…
エーっと…いるんでしたっけ?
半年ぶりぐらいにC言語を触るものでして…
やろうとしたらコンパイルの仕方すら忘れてて、文字入力→出力でコンパイルエラーが起きてしまったぐらいで…
どなたか分かる方いたら教えてくれませんか?

Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:18
by box
Cr さんが書きました:sizeofの件、見逃してました…
エーっと…いるんでしたっけ?
仮に不要であるとして、dに具体的な値(例えば10)を入れた

コード:

dis = (int**)malloc(10);
       *dis[i]=malloc(10);
がどういう意味を持つのか説明してみてください。

Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:24
by Cr
えーと、disにint**型にキャストしたメモリを10入れる…
あぁそうか!
int**型はあくまでキャストですから取得要領は変わんないんですね
int型×10にしなきゃだめですね
すっかり忘れてました
ありがとうございます。
freeの方はあれでよろしかったでしょうか?
[/quote]
仮に不要であるとして、dに具体的な値(例えば10)を入れた

コード:

dis = (int**)malloc(10);
       *dis[i]=malloc(10);
がどういう意味を持つのか説明してみてください。[/quote]

Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:25
by box
Cr さんが書きました:

コード:

dis = (int**)malloc(d);
こうやって確保した領域をfreeするときのコードが、どうして
Cr さんが書きました:

コード:

free(**dis);
なのでしょうか。
dis(型はint **)

**dis(型はint)
とは、全く別物です。

Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:32
by Cr
すいません、ありがとうございます
昔は普通にできたのに…
ホントダメになってるなぁ

コード:

for(i=0;i<d;i++){
       free(*dis[i])
}
free(dis);
ですか

Re: 二次配列の動的取得後のメモリ開放

Posted: 2011年9月03日(土) 21:43
by Cr
返事がないという事は、あってるという事でいいのかな…?
ありがとうございました!