神秘的 getenv() 段错误

Mysterious getenv() seg faults

我正在尝试导出变量并使用 getenv() 读回它,但由于某种原因,它给了我一个分段错误..

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

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

我 运行 Ubuntu 14.04.

奇怪的是它在gdb上运行正常,并且编译器输出在编译时没有显示错误,即使-Wall -Wextra...
为什么会这样?

system() 的子进程 运行 不影响调用 system() 的进程的环境。

因此,system()执行的shell并没有在调用进程的环境中设置LINESCOLUMNS,所以getenv()是可能会返回一对空指针,这在某种程度上引起了悲伤......除了 printf() 通常可以正常工作,即使将空指针传递给它以使用 %s 进行格式化(它产生 (null) for我,但这不是 C 标准强制要求的行为。

如果要设置环境变量,应该使用setenv()。您可能会遇到使用的旧代码 putenv() 而不是,但您不应在新代码中使用它。