• ベストアンサー

関数の引数をポインタで行う

****サンプル1******* main() { char* buff; a(buff); printf("%s",buff); return OK; } ****サンプル2******* main() { char buff[1+1]; a(buff); printf("%s",buff); return OK; } サンプル1では、変数buffは値が入らずサンプル2では 成功します。 なぜですか? プログラムにおける、細かい指摘はご了承ください。

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

  • ベストアンサー
  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.2

同じ関数無いだろうが、違う関数だろうが、不定のポインタにはアクセスしてはいけません。まかり間違って動作した場合には、それはたまたまです。 サンプル1の場合には、 char* buff; char hoge[64]; buff = hoge; a(buff); もしくは char* buff; buff = (char*)malloc(64); a(buff); . . . free(buff); とする必要があります。 ちなみにサンプル2の場合、 char buff[1+1]; ですので、buff用の領域は2バイトしか確保されていません。この場合にはbuffには1文字(終端文字の'\0'が最後に必要になるため)しか格納できません。それ以上格納したときの動作は処理系に依存します。(バッファオーバーフロー) これも超えても動作する場合はたまたまです。

fm0606
質問者

お礼

ありがとうございます。 とても勉強になりました。

その他の回答 (1)

  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.1

簡単に。 サンプル1ではchar *型の変数buffの値は不定です。 関数a()に渡す前に、領域をmalloc()などで確保する必要があります。

fm0606
質問者

補足

早速のご回答ありがとうございます。 もうひとつ質問なのですが、なぜ、同じ関数内だと 領域を確保しないでも問題ないのでしょうか?

関連するQ&A