Поведение strcmp
Когда я запускаю следующий код:
#include <stdio.h>
int main(int argc, char *argv[])
{
int p = 0;
p = strcmp(NULL,"foo");
return 0;
}
Я получаю ошибку сегментации. echo $? говорит 139. Но когда я бегу
#include <stdio.h>
int main(int argc, char *argv[])
{
int p = 0;
strcmp(NULL,"foo"); // Note removed assignment
return 0;
}
Я не получаю никакой ошибки сегментации. Может кто-нибудь прольет какой-то свет?
Вот моя информация о gcc:
> gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8)
Ответы
Ответ 1
Вероятно, вы используете параметры оптимизации при компиляции. Так как результат strcmp()
во втором фрагменте игнорируется, компилятор устраняет этот вызов функции, и поэтому ваша программа не сбой. Этот вызов можно устранить только потому, что strcmp()
является неотъемлемой функцией, компилятор знает, что эта функция не имеет побочных эффектов.
Ответ 2
Вам необходимо:
- Включить соответствующие заголовки или объявить функции вручную. Для
strcmp()
вам нужно <string.h>
.
- Не передавать недопустимый указатель, такой как NULL на
strcmp()
, так как он не защищает его и будет разыменовывать указатель, тем самым вызывая поведение undefined в вашей программе.
Ответ 3
Что вы делаете, это undefined. strcmp
требует действительных указателей на строки с нулевым завершением.
NULL
не является указателем на строку с нулевым завершением.