2015-03-25 33 views
-1

我想了解這個問題背後的原因;在兩個單獨的程序中,我有兩個非常類似的fgets實現。其中一個工作沒有任何問題,另一個導致分段錯誤。我可以看到的兩個程序之間的唯一區別在於,它的工作原理並不是採用任何命令行參數,而是一個不起作用的程序。在一個fgets實現中的分割錯誤,但不是另一個,類似的實現

是否有人能夠幫助我理解差異?我知道你不能使用fgets來處理你沒有分配內存的東西,那麼爲什麼第一個例子工作正常?

非常感謝!

工作代碼(不相關的部分丟失):

int main(){ 
    char *s; 
    while((fgets(s,100,stdin))){ 
     if (evaluate_checksum(s)){ 
      printf("%s",s); 
     } 
    } 
} 

的不工作的代碼:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv){ 
    int a; 
    int b; 
    int c; 
    int d; 
    sscanf(argv[1],"%d", &a); 
    sscanf(argv[2],"%d", &b); 
    sscanf(argv[3],"%d", &c); 
    sscanf(argv[4],"%d", &d); 

    char *line; 
    long u1; 
    long v1; 
    long u2; 
    long v2; 

    while ((fgets(line,100,stdin))){ 
     printf("%s", line); 
     char *endptr = line; 
     u1 = strtol(line,&endptr,10); 
     v1 = strtol(entptr,&endptr,10); 
     u2 = strtol(endptr,&endptr,10); 
     v2 = strtol(endptr,&endptr,10); 
     printf("%ld, %ld, %ld, %ld",u1,v1,u2,v2); 
    } 

} 
+0

在第一個例子中,你很幸運,'char * s'指向無害的地方。 – user3386109 2015-03-25 03:17:53

+0

未定義的行爲意味着任何***。有時它會立即崩潰。有時它似乎工作。有時它似乎工作,然後在半小時後崩潰。有時它似乎有效,然後將所有計算結果乘以1000,原因不明,然後因爲上司認爲你超出預算1000倍而被解僱。 (好吧,希望不是最後一部分) – immibis 2015-03-25 03:28:36

+0

這是調用fgets,不執行它。 (「實現一個功能」意味着編寫該功能的主體)。 – 2015-03-25 14:17:36

回答

4

兩個版本都表現出因爲你將數據讀入內存,你有沒有未定義行爲收購。在第一種情況下,它不是很明顯。在第二種情況下,它立即顯現出來。試圖理解他們的行爲並不富有成效。

2

而不是使用char指針來存儲字符串,你應該使用char數組。