поведение strcmp - PullRequest
       3

поведение strcmp

14 голосов
/ 08 февраля 2011

Когда я запускаю следующий код:

#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)

Ответы [ 3 ]

30 голосов
/ 08 февраля 2011

Вы, вероятно, используете опции оптимизации при компиляции. Поскольку результат strcmp() во втором фрагменте игнорируется, компилятор исключает этот вызов функции, и поэтому ваша программа не падает. Этот вызов можно устранить только потому, что strcmp() является встроенной функцией, компилятор знает, что эта функция не имеет побочных эффектов.

6 голосов
/ 08 февраля 2011

Вам необходимо:

  • Включить правильные заголовки или объявить функции вручную.Для strcmp() вам необходимо <string.h>.
  • Не передавать недопустимый указатель, такой как NULL, на strcmp(), поскольку он не защищает от него и разыменует указатель, вызывая, таким образом, неопределенное поведениепрограмма.
3 голосов
/ 08 февраля 2011

То, что вы делаете, не определено. strcmp требует допустимых указателей на строки с нулевым символом в конце.

NULL не является указателем на строку с нулевым символом в конце.

...