[英]I can't understand this segmentation fault
作為序言:我對編程和C語言都非常陌生。 我正在經歷K&R,我正在嘗試解決練習1-19。
我不明白是什么導致了j == i;行中的這種分段錯誤。
我一直在嘗試各種代碼組合來找出問題所在。
按照練習,我最初有一個循環來嘗試反轉字符數組,但是通過故障排除,我得出了j == i; 線。
這兩個值似乎沒什么問題,但是嘗試比較它們會給我一個錯誤。
#include <stdio.h>
#define MAXLENGTH 1000
int reverse(char line[]);
main()
{
int c = 0;
char line[MAXLENGTH];
while ((c = reverse(line)) != EOF) {
printf("%s\n", c);
}
return 0;
}
int reverse(char line[])
{
char r[MAXLENGTH];
int i, c, j, l;
i = c = j = l = 0;
printf("BEFORE GETARRAY\n");
while ((c = getchar()) != '\n' && c != EOF) {
line[i] = c;
i++;
printf("i: %d\n", i);
}
l = i - 1;
printf("i: %d\n", i);
printf("l: %d\n", l);
printf("j: %d\n", j);
printf("BEFORE REVERSING\n");
j == i;
return c;
我希望比較能夠毫無錯誤地得出結論。
如果您不僅可以描述錯誤所在,還可以描述原因,以便我可以嘗試改進,那將是很棒的。
j == i;
線沒有引起問題,它什么也沒做。 問題在這里:
while ((c = reverse(line)) != EOF) {
printf("%s\n", c);
}
您正在嘗試打印一個字符串,但您給了它c
,它是一個int
。 將錯誤的數據類型傳遞給printf
是未定義的行為,這就是導致分段錯誤的原因。 您可能想要這樣:
printf("%s\n", line);
另請注意,您尚未對字符串進行空終止。 在reverse
功能中,您需要:
printf("BEFORE REVERSING\n");
line[i] = '\0';
線j == i
完全與您的細分錯誤無關。 分割錯誤的主要問題是您的printf("%s\\n", c);
聲明。 因為您嘗試在傳遞int作為參數的同時打印字符串。 如果要打印getchar
的結果,則可以使用函數putchar
或作為替代方法printf("%c")
。 試試這個,它應該不會崩潰。
#include <stdio.h>
#define MAXLENGTH 1000
int reverse(char line[]);
int main()
{
int c = 0;
char line[MAXLENGTH];
while ((c = reverse(line)) != EOF) {
putchar(c);
}
return 0;
}
int reverse(char line[])
{
int i, c, j, l;
i = c = j = l = 0;
printf("BEFORE GETARRAY\n");
while ((c = getchar()) != '\n' && c != EOF) {
line[i] = c;
i++;
printf("i: %d\n", i);
}
l = i - 1;
printf("i: %d\n", i);
printf("l: %d\n", l);
printf("j: %d\n", j);
printf("BEFORE REVERSING\n");
return c;
}
我也刪除了多余的j == i
語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.