我想了解這個問題背後的原因;在兩個單獨的程序中,我有兩個非常類似的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);
}
}
在第一個例子中,你很幸運,'char * s'指向無害的地方。 – user3386109 2015-03-25 03:17:53
未定義的行爲意味着任何***。有時它會立即崩潰。有時它似乎工作。有時它似乎工作,然後在半小時後崩潰。有時它似乎有效,然後將所有計算結果乘以1000,原因不明,然後因爲上司認爲你超出預算1000倍而被解僱。 (好吧,希望不是最後一部分) – immibis 2015-03-25 03:28:36
這是調用fgets,不執行它。 (「實現一個功能」意味着編寫該功能的主體)。 – 2015-03-25 14:17:36