簡體   English   中英

我不明白這種細分錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM