c - 我无法理解这个段错误

标签 c arrays segmentation-fault runtime-error

前言:总的来说,我对编程和 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);

另请注意,您还没有以 null 终止字符串。在您的 reverse 函数中,您需要:

printf("BEFORE REVERSING\n");
line[i] = '\0';

关于c - 我无法理解这个段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55936537/

相关文章:

php - 我们可以在几秒钟后强制退出 C 程序的执行吗

c++ - 如何从双倍阵列创建声音并在扬声器上播放

c - 确定添加到以太网帧的填充量

c - 如何查看定时任务是否在后台运行?

javascript - 嵌套在 Foreach 中的 Map 函数未按预期运行 为什么?

c - 瑞士星历库不会在 Ubuntu 上运行

php - 从 MySQL 填充两列 HTML

C struct malloc 和指针数组实现

c++ - GCC - 类型声明的确切位置

c - 段错误 11?