2015-09-03 3 views
0

Я пытаюсь экспортировать переменные и читать ее обратно, используя getenv(), но по какой-то причине, он дает мне ошибку сегментации ..Таинственный 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")); 

    //Heisenbug? 
    return 0; 
} 

Я бег Ubuntu 14.04.

Странная вещь, что он работает нормально на БГД, а выход компилятор не показывает ошибку во время компиляции, даже с -Wall -Wextra ... Почему это происходит?

ответ

5

Детский процесс, выполняемый system(), не влияет на среду процесса, вызывающего system().

Таким образом, оболочка выполнена system() не установлен LINES или COLUMNS в среде вызывающего процесса, так getenv(), вероятно, возвращает пару нулевых указателей, которые каким-то образом вызывает печаль ... Кроме того, что printf() часто работает правильно, даже когда нулевой указатель передается ему для форматирования с %s (он произвел (null) для меня, но это не поведение, заданное стандартом C).

Обратите внимание, что я игнорирую непреднамеренный синтаксис (не формально ошибку) в сценарии оболочки - перед вторым есть точка с запятой или новая строка.

Если вы хотите установить переменную окружения, вы должны использовать setenv(). Вы можете встретить старый код, который вместо этого использует putenv(), но вы не должны использовать его в новом коде.

+0

то вы можете объяснить, почему это работает при работе на gdb? – hoholee12

+3

Вы вызываете «неопределенное поведение»; все может произойти, когда вы это делаете, в том числе «кажется, что работает - иногда». –

+0

ok ... могу я спросить, какую синтаксическую ошибку у меня есть в сценарии оболочки? – hoholee12

Смежные вопросы