带有strcmp的Segfault

时间:2011-06-10 04:15:11

标签: c evaluation strcmp args 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;
    }
    
  3. 我将它保存为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
    

    最终运行它,给出了如下所示的seg错误

    [Neutron@Discovery examples]$ ./str Jimmy Neutron
    
    
    Jimmy   Neutron
    
    -4
    
    Segmentation fault (core dumped)
    

2 个答案:

答案 0 :(得分:14)

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

而不是printf("%d\n", strcmp(*(--args),*(++args)));

DO

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

仍然不能真正读取(更好地使用索引并检查argc的有效性),但至少不要更改值并在同一序列点多次评估它。

答案 1 :(得分:6)

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