Поведение 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 не является указателем на строку с нулевым завершением.