【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21834

char型ポインタの宣言についての疑問
投稿者---tongari(2005/07/11 12:00:25)


環境は、RedHat9.0を使用しています。

初心者的な質問ですが、char型ポインタの宣言について
質問させて頂きます。

例えば、

char *env = getenv("環境変数");

と宣言したとします。

*envは、文字列先頭を示しており、getenvで環境変数を取得した際、
数文字〜数十文字の文字列の先頭が*envに格納されます。

このとき、*envの先頭から数文字〜数十文字の文字列の確保に失敗
する場合があるのではないかと疑問に思いました。

getenvを調べたところ、返り値は失敗時に環境変数が見つからない
ときにNULLが返るとしか書いていません。


初心者的に質問ですが、ご教授下さい。宜しくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:char型ポインタの宣言についての疑問 21836 まきじ 2005/07/11 12:18:37
<子記事> Re:char型ポインタの宣言についての疑問 21861 かずま 2005/07/12 02:17:16


No.21836

Re:char型ポインタの宣言についての疑問
投稿者---まきじ(2005/07/11 12:18:37)


>getenvを調べたところ、返り値は失敗時に環境変数が見つからない
>ときにNULLが返るとしか書いていません。
>初心者的に質問ですが、ご教授下さい。宜しくお願いします。

肝心な質問は何でしょうか?
getenv() が失敗すれば、env は NULL になります。


この投稿にコメントする

削除パスワード

No.21838

Re:char型ポインタの宣言についての疑問
投稿者---tongari(2005/07/11 12:38:52)


>肝心な質問は何でしょうか?
>getenv() が失敗すれば、env は NULL になります。

質問は、
>*envは、文字列先頭を示しており、getenvで環境変数を取得した際、
>数文字〜数十文字の文字列の先頭が*envに格納されます。

>このとき、*envの先頭から数文字〜数十文字の文字列の確保に失敗
>する場合があるのではないかと疑問に思いました。

文字列の確保に失敗する場合があるのではないかと疑問に思っている
のですが、どのようになるのでしょうか?


宜しくお願い致します。


この投稿にコメントする

削除パスワード

No.21839

Re:char型ポインタの宣言についての疑問
投稿者---まきじ(2005/07/11 12:41:32)


>文字列の確保に失敗する場合があるのではないかと疑問に思っている
>のですが、どのようになるのでしょうか?

MSDN に
「環境テーブルに varname がない場合、戻り値は NULL です。」
と記載されています。


この投稿にコメントする

削除パスワード

No.21840

Re:char型ポインタの宣言についての疑問
投稿者---tongari(2005/07/11 12:45:52)


>MSDN に
>「環境テーブルに varname がない場合、戻り値は NULL です。」
>と記載されています。


ご解答有難うございました。

UNIX系でもどうようなのでしょうか?


この投稿にコメントする

削除パスワード

No.21841

Re:char型ポインタの宣言についての疑問
投稿者---まきじ(2005/07/11 12:47:49)


>UNIX系でもどうようなのでしょうか?

同様だと思います。
因みに、man getenv で調べられると思います。


この投稿にコメントする

削除パスワード

No.21843

Re:char型ポインタの宣言についての疑問
投稿者---tongari(2005/07/11 13:22:55)


>>UNIX系でもどうようなのでしょうか?
>
>同様だと思います。
>因みに、man getenv で調べられると思います。

getenvの返り値がNULLの場合、文字列領域の確保失敗 または 環境変数
が設定されていないのどちらかということですね。


有難うございました。


この投稿にコメントする

削除パスワード

No.21845

Re:char型ポインタの宣言についての疑問
投稿者---おでん(2005/07/11 13:30:48)


>>>UNIX系でもどうようなのでしょうか?
>>
>>同様だと思います。
>>因みに、man getenv で調べられると思います。
>
引用------------------------>
`getenv' searches the list of environment variable names and values
(using the global pointer "`char **environ'") for a variable whose
name matches the string at NAME. If a variable name matches,
`getenv' returns a pointer to the associated value.
<----------------------------ここまで
とあるので「メモリが確保できなかった」事は
あまり考えなくてもいいかも知れません。


この投稿にコメントする

削除パスワード

No.21847

Re:char型ポインタの宣言についての疑問
投稿者---tongari(2005/07/11 13:54:17)


>>>>UNIX系でもどうようなのでしょうか?
>>>
>>>同様だと思います。
>>>因みに、man getenv で調べられると思います。
>>
>引用------------------------>
>`getenv' searches the list of environment variable names and values
> (using the global pointer "`char **environ'") for a variable whose
> name matches the string at NAME. If a variable name matches,
> `getenv' returns a pointer to the associated value.
><----------------------------ここまで
>とあるので「メモリが確保できなかった」事は
>あまり考えなくてもいいかも知れません。


メモリ確保について、少し気になっていたので投稿させて頂きました。
どうも有難うございました。


この投稿にコメントする

削除パスワード

No.21852

Re:char型ポインタの宣言についての疑問
投稿者---Hermit(2005/07/11 22:32:22)


>メモリ確保について、少し気になっていたので投稿させて頂きました。
>どうも有難うございました。

メモリを確保した領域を返すとは書いていないので、
getenv()が確保しちゃ、まずい気がしますが。


この投稿にコメントする

削除パスワード

No.21844

Re:char型ポインタの宣言についての疑問
投稿者---NykR(2005/07/11 13:25:41)


>UNIX系でもどうようなのでしょうか?

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getenv.3.html

同様です。


この投稿にコメントする

削除パスワード

No.21846

Re:char型ポインタの宣言についての疑問
投稿者---tongari(2005/07/11 13:50:44)


>>UNIX系でもどうようなのでしょうか?
>
>http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getenv.3.html
>
>同様です。


確認させて頂きました。manコマンドでも同様のことが書いておりました。
有難うございました。


この投稿にコメントする

削除パスワード

No.21861

Re:char型ポインタの宣言についての疑問
投稿者---かずま(2005/07/12 02:17:16)


> char *env = getenv("環境変数");
>
> と宣言したとします。
>
> *envは、文字列先頭を示しており、getenvで環境変数を取得した際、
> 数文字〜数十文字の文字列の先頭が*envに格納されます。

文字列の先頭の文字へのポインタが env に格納されます。


> このとき、*envの先頭から数文字〜数十文字の文字列の確保に失敗
> する場合があるのではないかと疑問に思いました。

文字列を新たに確保することは行いません。

環境変数が存在するということは、今、実行しているプログラムのメモリ
空間に "環境変数=文字列" という文字列が存在しているので、getenv()
は "環境変数=" の次のアドレスを返すだけです。

Linux の bash のコマンドラインで、export HOGE=abc を実行してから、
試しに次のプログラムを実行してみてください。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *env = getenv("HOGE");
    if (env) {
        puts(env);
        puts(env-5);
    }
    return 0;
}


また、環境変数すべてを表示するプログラムは次のようになります。

#include <stdio.h>
#include <stdlib.h>

extern char **environ;

int main(void)
{
    int i;
    for (i = 0; environ[i]; i++) puts(environ[i]);
    return 0;
}

あるいは、

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    int i;
    for (i = 0; envp[i]; i++) puts(envp[i]);
    return 0;
}



この投稿にコメントする

削除パスワード

No.21863

Re:char型ポインタの宣言についての疑問
投稿者---tongari(2005/07/12 09:56:17)


>文字列の先頭の文字へのポインタが env に格納されます。

そうでしたね。誤記を指摘して頂き有難うございます。


>文字列を新たに確保することは行いません。

>環境変数が存在するということは、今、実行しているプログラムのメモリ
>空間に "環境変数=文字列" という文字列が存在しているので、getenv()
>は "環境変数=" の次のアドレスを返すだけです。

なるほど、納得のいく解答有難うございます。

サンプルプログラムを確認させて頂きました。
実行させて頂き、かずまさんのおっしゃっていることが理解できました。

また、environ関数についてはどういうものであるか知っていましたが、
envpという環境変数を一括で表示できるポインタがあるとは知りません
でした。

勉強になりました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧