• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:メモリ)

メモリについての疑問

このQ&Aのポイント
  • メモリについてご質問します。char *p; p = (char *)malloc(100); とすればpに100バイトのメモリが割り当てられる・・pに文字列を代入する場合100バイトまで格納可能である。
  • ファイルからの一行のある部分の文字列を入れる場合、sについてもメモリを取得しなければなりません。その際、whileの外でメモリを取得するのか、whileの中でメモリを取得するのかどちらが適切でしょうか?
  • while文の中でメモリを作成すると、1回ごとに新たなメモリをとっているのか、それとも更新されていているのかがわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ちょっと話がずれますが、 s = (char *)malloc(100); と、 s = GetWord(・・)//何らかの文字列が返っ てくるは(もしもこの通りなら)連続して 使ってはいけません。 C/C++には、文法的には、文字列とい う型はなくて、多くの場合、char * という、 ポインタです。(string の場合もある) ですから、GetWord() は、char *GetWord(); とchar * を返すと思いますが、そうすると、 s = (char *)malloc(100); で、確保した領域(の先頭)をセットしても、 s = GetWord(); とした瞬間、malloc() で確保した領域は永 久にアクセスできなくなります。 ついでにいえば、この状態で、 free(s); とすると、良くないことが起こるかもしれま せん。(GetWord() の中で、malloc() してい たらOK、GetWord の static な領域を使っ ていたらNG) もしくは、 s = (char *)malloc(100); した領域に、strcpy(); などで、コピーする 必要があります。 さて、 s = (char *)malloc(100); がループの中か外かは、 「ひとつ前のループの時、s に代入されたポ インタは、どうなるか?」で決まります。 1回のループ毎に、どこかに、ポインタその ものが保存されたりして、ひとつ前のループ の時のポインタがを保持しておく必要がある なら、ループの中で毎回確保する必要があり ます。 ひとつ前の s に入っていた内容が、上書き されてもいいなら、ループの外に置いておけ ばいいでしょう。 もしかして、 最初、 char s[100]; で作っていたら、 s = GetWord(); でコンパイラに怒られたので、 char *s; に変えてみた。 ということなら、上述の通り ・事前に s の領域を確保する必要はない  (GetWord() 内部で確保された領域を   流用すればいい) ・strcpy で GetWord() の返却値を  コピーする必要がある のどちらかでしょう。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>このときのsについてもメモリを取得しなければなりません。 必ずしもそうとはいえません。 GetWordがchar型へのポインタを返すのであれば、 sのためにmallocする必要はありません。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

何か認識が違う気がします。 >pに100バイトのメモリが割り当てられる プログラム領域以外のメモリはシステム管理領域(ヒープと言う)で、 そこから100バイトのメモリが割り当てられます。mallocの戻り値は その領域のアドレスであって、ポインタ型(極端に言えばlong型)なら どんな変数に入れて使用してもかまいません。 あくまで、「pに」ではありません。 >s = GetWord(・・)//何らかの文字列が返ってくる 返ってくる文字列は誰が用意したメモリ上にあるものですか? 呼び出し元が用意した領域を返すなら、ループの外側で定義して、 使い回しをする方が効率的です。関数自体が領域を確保しているなら ループの終わりで、毎回freeしなければなりません。 >while文の中でメモリを作成すると mallocの度に新しいメモリが確保されます。解放しないで、mallocを 繰り返すと、ヒープをどんどん消費してしまいます。 更新されるのではありません。 >すると残りは90バイトでしょうか 何処に何バイト読み込むか指令するのはプログラマの責任です。 使用した部分だけ有効なのであって、「残り」を気にするのは 何か重大な勘違いをしていると思います。 ファイルの1行が最大99バイトまでなので100バイトの領域を確保した というのが正しい考えで、1行読み込む度に有効長を調べながら処理 するのが正しい態度です。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

一回取った領域を使い回すならループの外で、ループのたびに新しい領域を使うならループの中で。 なお、どちらの場合も確保した領域は必要なくなったらfreeで開放しなければいけません。

minaraiH
質問者

補足

使いまわすとありますが例えば100バイトとって 最初の一行で10バイトを使用した すると残りは90バイトでしょうか?

関連するQ&A

専門家に質問してみよう