- ベストアンサー
関数の引数をポインタで行う
****サンプル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では 成功します。 なぜですか? プログラムにおける、細かい指摘はご了承ください。
- みんなの回答 (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'が最後に必要になるため)しか格納できません。それ以上格納したときの動作は処理系に依存します。(バッファオーバーフロー) これも超えても動作する場合はたまたまです。
その他の回答 (1)
- yosi_yosi
- ベストアンサー率35% (165/468)
簡単に。 サンプル1ではchar *型の変数buffの値は不定です。 関数a()に渡す前に、領域をmalloc()などで確保する必要があります。
補足
早速のご回答ありがとうございます。 もうひとつ質問なのですが、なぜ、同じ関数内だと 領域を確保しないでも問題ないのでしょうか?
お礼
ありがとうございます。 とても勉強になりました。