2011-06-10 77 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