2011-06-10 48 views
10

我使用的strcmp在以下方式段错误使用strcmp

  1. 传递的char []数组名称
  2. 传递指针字符串文字 但是,第二个结果中赛格故障。即使我已经证实,指针指向正确的字符串文字,我很困惑,为什么我收到赛格故障.. 下面是代码: -

    #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; 
    } 
    

我将其保存为海峡。 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 

终于运行它,给人以赛格故障如下图所示

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


Jimmy Neutron 

-4 

Segmentation fault (core dumped) 
+3

投票“太局部化”在这根本没有意义。这可以说是http://stackoverflow.com/questions/7877258/why-does-this-ii-3-generate-a-warning-may-be-undefined的重复,因为真正的问题是“这个警告是什么意思? “但过于本土化就是不正当的:无助和缺少重点。 – Flexo 2012-03-16 10:12:32

回答

14

当您将相同的变量作为两个不同的参数传递给相同的函数两次时,请勿使用--++。取而代之的printf("%d\n", strcmp(*(--args),*(++args)));

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

还没有真正可读(更好地利用指标和核对argc的有效性),但至少你不改变价值和评估多次它在相同的序列点。

+0

为什么? C应该将指针的副本传递给该函数。 – Jimm 2011-06-10 04:19:02

+4

@Jimm:C并不保证任何评估顺序。它通常不是从左到右。在同一语句中多次修改变量是未定义的行为。 – 2011-06-10 04:19:56

+0

@Jimm,是的,但你正在改变价值观并同时评估它们,这是未定义的行为。 – littleadv 2011-06-10 04:20:29

6

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

+0

奇数,即使strcmp,是一个无限制的字符串函数,上面的字符数组没有NULL字符可以很好地工作。只有当我使用指针strcmp时,我才会遇到seg错误。 – Jimm 2011-06-10 04:22:40

+1

@吉姆,纯粹是运气。 – littleadv 2011-06-10 04:23:49

+1

@Jimm:它仍然是未定义的行为,因为缓冲区溢出仍然发生(它_will_写一个空终止符;它只会在你的缓冲区的边界外)。在这种情况下,幸运的是缓冲区溢出不会更快地杀死你的程序。 – 2011-06-10 04:24:05