带有strcmp的Segfault

Jim*_*imm 10 c evaluation args strcmp sequence-points

我在以下方面使用strcmp

  1. 传递char []数组名称
  2. 将指针传递给字符串文字,但第二个结果是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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

我将它保存为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
Run Code Online (Sandbox Code Playgroud)

最后运行它,给出一个seg错误,如下所示

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


Jimmy   Neutron

-4

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

lit*_*adv 14

当两个不同的参数将同一个变量传递给同一个函数时,请不要使用--++.

代替 printf("%d\n", strcmp(*(--args),*(++args)));

char *first = *(--args);
char *second = *(++args);
printf("%d\n", strcmp(first,second));
Run Code Online (Sandbox Code Playgroud)

仍然不是真正可读(更好地使用索引和检查argc有效性),但至少你不改变值并在同一序列点多次评估它.

  • 它正在修改指针变量`args`,你不能在序列点之间多次修改它. (6认同)
  • @Jimm:C不保证任何评估顺序.它通常不是从左到右.在同一语句中多次修改变量是未定义的行为. (4认同)
  • 感谢您将序列点告诉我的知识.这是缺失的环节,这让我很难理解littleadv的评论.在维基百科上查看序列点http://en.wikipedia.org/wiki/Sequence_point之后,它实际上告诉了它的引用中的确切子句 (2认同)
  • 阅读[comp.lang.c FAQ](http://c-faq.com)的第3部分.然后阅读剩下的部分. (2认同)

Chr*_*ung 6

除了littleadv的帖子所说的,你的缓冲区是一个字符太短(它没有给空终止符留下任何空间).因此,您strcpy的缓冲区溢出.