-1

変数をエクスポートして読み戻そうとしていますgetenv()が、何らかの理由でセグメンテーション違反が発生します..

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

int main(){
    system("export LINES=$(stty size | awk '{print $1}');"
        "export COLUMNS=$(stty size | awk '{print $2}')");
    printf("%s %s\n", getenv("LINES"), getenv("COLUMNS"));
    return 0;
}

Ubuntu 14.04 を実行しています。

奇妙なことは、gdbで正常に実行され、コンパイル中にコンパイラの出力にエラーが表示されないことです-Wall -Wextra...
なぜこれが起こっているのですか?

4

1 に答える 1

6

によって実行される子プロセスsystem()は、 を呼び出すプロセスの環境には影響しませんsystem()

したがって、によって実行されるシェルsystem()は設定されていないLINESCOLUMNS、呼び出しプロセスの環境内にないため、getenv()おそらく null ポインターのペアを返している可能性があり、これはどういうわけか悲しみを引き起こしています…ただしprintf()、null ポインターが渡された場合でも正しく動作することがよくあります。でフォーマットします%s(null)私のために作成されましたが、それはC標準で義務付けられている動作ではありません)。

環境変数を設定したい場合は、setenv(). putenv()代わりにを使用する古いコードに出くわすかもしれ ませんが、新しいコードでは使用しないでください。

于 2015-09-03T04:42:17.857 に答える