C言語について質問です

Writer: admin Type: bensonb Date: 2018-12-30 00:00
C言語について質問です以下の写真の中のコードに関してなんですがこの問題の1の(2)の回答が関数内をX* p = malloc(sizeof(X))p->x=xp->y=yreturn p(この後main関数内でfreeを使って解放)のように書き換えたものになってるんですがなぜメモリを割り当てたら解決するのかがよく分からないんですがmallocでポインタ変数pにメモリを割り当てることで関数から抜け出してもpの領域が解放されるのを防ぐためというような感じで良いですか?###【mallocでポインタ変数pにメモリを割り当てることで関数から抜け出してもpの領域が解放されるのを防ぐためというような感じで良いですか?】ええ、良いですよ。《参考》xs は create_X 関数内にある自動変数です。このため、create_X 関数の処理が終わると姿を消します。自動的に消えるから自動変数というわけで。&xs として、その先々消えてしまう変数の在り処を return 文で呼び出し主に返してしまっても、抜け殻の場所を伝えるだけになってしまいます。(しかも悪いことにその抜け殻の場所には別のデータが置かれることも…もう、使い終わった場所なのですから他のデータのために用いられるのですよ)そこで、malloc で、広大なメモリ中のどこかに場所を確保してですね、そこにデータを置くと安心です。勝手に消されたりしませんので。(free を行うと消えます。それまでは消えません。)「ポインタ変数pにメモリを割り当てる」もしかすると、言い回しに若干注意が必要かもしれません。ポインタ変数にメモリを割り当てると言ってしまうと、本当にポインタ変数のためにメモリを割り当てているのかと誤解される恐れがあります。実際の話、ポインタ変数は関係無いです。それとは無関係にメモリを割り当てています。で、どこに割り当てたか分からなくなってしまうとまずいので、ポインタ変数に覚えてもらおうという寸法です。ナイス0
###回答ありがとうございます!正直malloc関数についてもあやふやなところがあったのでこの回答を見てスッキリしました。###画像内がよくわからないのでなんとも言えませんが、質問者様がおっしゃっていることから推測して話します。mallocでメモリを確保し、ポインタ変数をreturnすることによって値渡しではなく参照渡しをしているからだと思われます。逆にいうと、ポインタ変数を使わずに構造体を定義すると、値渡しをせざるを得なくなり、必然的に参照渡しをできないからです。(ちなみに、値渡し:変数の値のみを渡す/参照渡し:変数そのものを渡す)少し、配列(構造体も原理は同じ)とアドレスについて説明します。一般的に、確保した配列全体のアドレスというのは、配列の先頭のアドレスが割り当てられます。つまり、例えばint array[]という配列があったら、こいつのアドレスはarray[0]と同じというわけです。なぜこれで配列として問題ないかというと、array[1]やarray[2]などは、array[0]に続く領域に確保されるようになっているからです。つまり、array[0]のアドレスさえわかればarray[]がわかったも同然というわけです。話を戻します。残念ながらreturn文というのは1つの値しか返すことができません。つまり、array[]の要素を全て返そうと思っても、全ての値はreturnでは返せないのです。(Pythonなどのreturnでは話が変わってきます)ではどうすればよいでしょうか。答えは、「配列の先頭アドレスのみを返す」です。こうすれば、先ほども説明した通り、実質配列全体を返すことに成功できますナイス0

 

TAG