0

独自のバージョンの getenv を作成しようとしています。私はまだ始めていないので、まず環境を理解しようとしています。

それがグローバルである場合、関数でそれを印刷できないのはなぜですか? 環境は文字列ですか、それとも文字の配列ですか? なぜenvironはダブルポインタなのですか? ありがとうございました。

#include <iostream>
#include <string>
#include <stdlib.h>
void myenv(char*);

void myenv(char* name)
{
std::cout<<environ;
}

int main(int argc, char** argv, char** environ)
{
myenv("PATH");
}
4

3 に答える 3

2

environですchar**。の配列をchar*指し、それぞれが の文字列を指しますchar。つまり、文字列の配列のようなものです。たとえばenviron[0]、ヌル終了文字列です。それを印刷してみてください:

std::cout << environ[0];

各文字列は、形式の環境変数ですname=value。これらは、現在のプロセスの環境変数に対応しています。

ただし、environこれは C++ の機能ではなく、移植性がありません。unistd.hこれは、POSIX で定義されているヘッダーに由来します。

于 2013-02-08T19:41:33.857 に答える
1

そのchar **envを含む。変数

extern char **environ;

http://pubs.opengroup.org/onlinepubs/007908799/xsh/environ.html

于 2013-02-08T19:39:18.863 に答える
0

追加するだけです。

環境は文字列ですか、それとも文字の配列ですか? なぜenvironはダブルポインタなのですか?

環境変数は、それぞれ文字列の最初のアドレスを指すポインターの配列をアドレス指定します。環境は 1 つの文字列ではなく、一連の文字列です (「束」がゼロになるように、環境は空である可能性があります)。

environ[0] contains a pointer to the 'first' environment variable.
environ[1] contains a pointer to the 'second'.

environ[0][0] would reference the first character of the 'first' name in the environment.
environ[1][0] would reference the first character of the 'second' name.

または、少なくとも 2 つの環境変数がない場合、environ[1] は segfault land またはさらに悪いことに random memory を指します

環境名の文字列がどのように順序付けられるかについて定義された規則がないため、最初と 2 番目を引用しました (たとえば、名前がアルファベット順であるとは思わないでください)。

于 2013-02-08T20:17:33.900 に答える