Подтвердить что ты не робот

Segfault с strcmp

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

  • Передача имен char []
  • Передача указателей на строковые литералы но, второй результат в seg-ошибке. даже если я подтвердил, что указатели указывают на правильные строковые литералы, я смущен тем, почему я получаю 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, и когда я его компилирую, сначала я получаю следующее предупреждение:

[[email protected] examples]$ gcc -Wall str.c -o str

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

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

[[email protected] examples]$ ./str Jimmy Neutron


Jimmy   Neutron

-4

Segmentation fault (core dumped)
4b9b3361

Ответ 1

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

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

делать

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

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

Ответ 2

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