- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:自動変数の有効範囲について)
自動変数の有効範囲とは?仕組みと注意点
このQ&Aのポイント
- 自動変数の有効範囲とは、変数が有効な範囲を指す言葉です。変数が宣言されたブロック内でのみ有効であり、ブロックを抜けると自動的にメモリが解放されます。
- プログラム中でchar *strを使った場合、その有効範囲は関数内でのみ有効です。しかし、ポインタの指す先を文字列リテラルとして指定すると、そのメモリはプログラム全体で共有されるため、別の場所からでも参照が可能です。
- char *を返したい場合はmallocを使って動的にメモリを確保し、そのポインタを返すことが一般的です。返されたポインタを使用した後は必ず解放する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
文字列リテラルが「static な文字配列」であることを理解していれば, 「たまたま」ではなく「必然」であるとわかる.
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
回答No.3
そのコードが意図しない結果を招くのであれば、 下のコードも意図しない結果を招くことになります。 実際はどうですか? #include <stdio.h> int sub(void); int main(void) { int a; a = sub(); printf("%d\n", a); return 0; } int sub(void) { int n; n = 12345; return n; }
質問者
補足
すいません。言葉足らずでした。 このコードですと値が返ってしまうため、sub()内のnとmain()内のaはアドレスが違ってしまいますよね。 ポインタを返しているのに、なぜその値が静的変数でもないのに関数を超えて維持されているのかがわかりませんでした。 別回答を頂いた方から文字列リテラルはstaticであると教えていただいて謎が氷解しました。
noname#116548
回答No.2
何処がおかしいのかな? *strに"abc"のポインタを入れてmainに返す。 そのポインタの示すアドレスの文字列を表示する。 ?何をしたいのかな…
質問者
補足
言葉足らずですいませんでした。 ポインタを返しているのに、関数ブロックを越えてアドレスが維持されているのが理解できなかったんです。 説明不足ですいませんでした。
お礼
なるほど!!。 的確かつ明快な回答ありがとうございました。 staticな文字列であるから関数の範囲を超えてアドレスが維持されていたのですね。 ありがとうございました。