2014-10-18 2 views
0

Если getenv должен возвращать указатель на значение в среде, не должна ли эта программа печатать строковое значение переменной окружения?Ошибка printf и getenv - ожидает символ char *, но аргумент 2 имеет тип int

#include <stdio.h> 
#include <unistd.h> 

int main() { 

    printf("HOME=%s\n",getenv("HOME")); 

    return 0; 
} 

Я получаю следующее предупреждение, когда я компилирую:

format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ 

И когда я запускаю программу, я получаю Segmentation Fault.

Я использую Ubuntu, и мне интересно, связано ли это с разрешениями или другой формой безопасности.

+4

'#include ' – BLUEPIXY

+0

я вещь, которая должна быть #include также, GETENV() может возвращать NULL, так что условие ошибки должно быть проверено, прежде чем передать код возврата в printf() – user3629249

ответ

2

Вам необходимо #include <stdlib.h>, так как здесь объявляется getenv().

Кроме того, рассмотрите возможность использования опции -Wall, чтобы включить дополнительную диагностику из gcc или MSVC (или большинства компиляторов). В этом случае НКУ бы сказал:

warning: implicit declaration of function 'getenv' [-Wimplicit-function-declaration] 

и MSVC бы сказал:

warning C4013: 'getenv' undefined; assuming extern returning int 
+0

Это решило, спасибо, я не понимаю, почему я это пропустил. –

+0

Справа. Компилятор должен знать прототип функции перед вызовом функции, иначе компилятор предполагает прототип функции по умолчанию, т. Е. Int function (int, int). Вероятно, поэтому тема плаката встречает это предупреждение. –

+0

Спасибо за подсказку -Wall, я попробовал это, когда я скомпилировал, и у меня появилось предупреждение о выходе. Это очень помогает. –

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