Segfault с помощью strcmp - PullRequest
       108

Segfault с помощью strcmp

10 голосов
/ 10 июня 2011

Я использую strcmp следующими способами

  1. Передача имен массивов char []
  2. Передача указателей на строковые литералы, но второй результат приводит к ошибке seg.хотя я и подтвердил, что указатели указывают на правильные строковые литералы, я не совсем понимаю, почему я получаю ошибку сегмента .. Вот код: -

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char const *args[])
    {
      char firstName[strlen(*++args)];
      strcpy(firstName, *args);
      char lastName[strlen(*++args)];
      strcpy(lastName, *args);
      printf("%s\t%s\n", firstName, lastName);
    
      printf("%d\n", strcmp(firstName, lastName));// this works
    
      printf("%d\n", strcmp(*(--args),*(++args)));//this gives me a seg fault
    
      return EXIT_SUCCESS;
    }
    

Я сохраняюэто как str.c, и когда я его компилирую, сначала я получаю следующее предупреждение:

[Neutron@Discovery examples]$ gcc -Wall str.c -o str

str.c: In function ‘main’:
str.c:15: warning: operation on ‘args’ may be undefined

наконец, запустив его, выдает ошибку сегмента, как показано ниже

[Neutron@Discovery examples]$ ./str Jimmy Neutron


Jimmy   Neutron

-4

Segmentation fault (core dumped)

Ответы [ 2 ]

14 голосов
/ 10 июня 2011

Не используйте -- и ++ при передаче одной и той же переменной в одну и ту же функцию дважды в качестве двух разных параметров.

Вместо printf("%d\n", strcmp(*(--args),*(++args)));

do

char *first = *(--args);
char *second = *(++args);
printf("%d\n", strcmp(first,second));

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

6 голосов
/ 10 июня 2011

В дополнение к тому, что говорится в посте littleadv, ваши буферы на один символ слишком короткие (это не оставляло места для нулевого терминатора).Таким образом, ваш strcpy вызывает переполнение буфера.

...