タイトルにも書いてありますが、c言語でgetenv関数でcharが返せる理由が知りたいです。
今までcharを戻り値に返したいときは、スコープの関係で
C
1char* test(char* p1) { 2 p1 = "test"; 3 return p1; 4}
としていました.
しかし、getenv()を使ってみたところ
c
1 char *env_name = "HOME"; 2 char *env = getenv(env_name); 3 printf("%s", env_name);
とできました。
getenv()はなぜ、char*をreturnできるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
C言語でポインタを返す場合、どこかに実体を確保しないといけませんが、「static
変数」や「malloc
で確保した領域」であれば、(それぞれ使い方には要注意ですが)与えていないポインタを返すことができます。
そして、getenv
については、一例としてLinuxのmanを見てみると、
通常の実装では、
getenv()
は環境リスト内の文字列へのポインターを返す。 呼び出し元はこの文字列を変更しないように注意しなければならない。 この文字列を変更すると、そのプロセスの環境を変化させることになるからである。
とあるように、環境変数を保存する領域へのポインタを返している、とのことです。
投稿2018/05/31 06:39
編集2018/05/31 06:46総合スコア145184
0
ベストアンサー決まっちゃっいましたけど、書きかけたので投稿しておきます。
maisumakunさんの回答どおりでgetenvについては付け足すところはありません。
そもそも最初に書いているコードが間違っています。
c
1// 元のコード 2char* test(char* p1) { 3 p1 = "test"; 4 return p1; 5} 6 7// こう書いても一緒です 8char* test(void) { 9 char *p1 = "test"; 10 return p1; 11} 12 13// 更にこれでも一緒です 14char* test(void) { 15 return "test"; 16}
char*(に限らずアドレス)を返してはいけないのはこういうパターンですね。
c
1char* test(void) { 2 char p[5]; 3 strcpy(p, "abc"); 4 return p; 5}
pはローカル変数なので関数を抜けた時点で値の保障はできません。
これなら大丈夫。
c
1char* test(void) { 2 static char p[5]; 3 strcpy(p, "abc"); 4 return p; 5}
投稿2018/05/31 06:55
総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/31 07:11
2018/05/31 07:49
2018/05/31 07:58
2018/05/31 08:05
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/31 06:45
2018/05/31 06:47 編集
2018/05/31 06:47