2011-01-17 21 views
0

文字列の配列がどのように宣言されているか知りたいですか?私がしていることは、文字列へのポインタのポインタの配列を宣言することです。例えば。文字列と文字列の配列**環境変数

char *array[]= {"string1","string2","string3"}; 

私は、Linuxで環境変数を変更することについて読んでポインタのcharにつまずいた**環境(http://www.cs.bham.ac.uk/resources/courses/2005/17423/doc/libc/Environment-Access.html#Environment-Access)。

char ** environは文字列の配列として宣言されています。私はそれがポインタへのポインタであるべきだと思います。たとえば。

char *array[]= {"string1","string2","string3"}; 
environ = array; 

私は何か間違っていますか?

私もどこかでその文字を読む*argv[] = char **argv.どうすれば可能ですか?

編集:このスレッドは非常に役に立ちます。 Should I use char** argv or char* argv[] in C?

+0

私が 'char * array'を宣言したとき、私はポインタの配列であると信じているものとして例を挙げていました。私は尋ねたかった、正確に 'char ** environ'は何ですか?それは文字列へのポインタの配列へのポインタですか、それとも文字列の配列ですか? –

答えて

1

実際にはCを学んでいる人にとっては分かりづらい2つの異なるものを混在させています。関数内の変数の宣言と関数パラメータの宣言は同じではありません。等価性

char*argv[] ~~~ char **argv 

このパラメータは、(main)です。配列は、実際にはポインタを宣言するのと同じものです。

あなたの割り当てenviron = arrayは構文的に間違っていませんが、コンパイラはそれを受け入れます。あなたは が*environを割り当てられ、誰とどのように知りません

  • :しかし、それはいくつかの理由で、意味的に間違っています。
  • の最初の内容は*evironです。
  • の機能を残すと、 はリサイクルされるローカルストレージを割り当てます。したがって、 機能を終了すると、*environは になります。

したがって、environは、このような割り当てを行うのに悪い例です。

+0

ありがとう!私は今それを得ると思います。 –

+0

配列をローカルストレージに置くのとは別に、環境を変更するために他の関数と混用しない限り、このように 'environ'を割り当てることには何も問題ありません。これはおそらく、子プロセスのための環境をセットアップするための最も安全な方法であり、suid-rootプログラムの 'main'の最初の行です。 –

1

よく問題があります。あなたのプログラムでは、いくつかのポインタがあります。あなたは文字列の配列に頼り、環境変数を指すenvironという文字列を使います。 environ = arrayでCに言うと、environにはarrayと同じ値が与えられますが、arrayにはローカル配列へのポインタがあります。そのステートメントの後、環境ポインタは作成した配列を指し示すだけですが、以前のコンテンツに何も変更を加えていません。

私はあなたがstrcpyに配列のすべての要素をenvironにする必要があると思います。または、apiコールsetenv(私はそれだと思います)を使用してください

とあなたの2番目の質問に。はい、[]の最初のペアは常にポインタに書き換えられます。配列[] =そのままの配列array[][5] = (*array)[5]とそこには*array[] = **array

あなたのお役に立てば幸いです。

+0

私が 'char * array'を宣言したとき、私はポインタの配列であると信じています。私は尋ねたかった、正確に 'char ** environ'は何ですか?それは文字列へのポインタの配列へのポインタですか、それとも文字列の配列ですか? –

1

Cでは、文字列は基本的に単なる文字の配列です。さらに、配列名はそのアドレスも表します。

この理由は、argv []は文字列の配列のアドレスであり、* argvは文字列のアドレスです(最初のcharのアドレスなので)。