为什么我收到MAXLEN <10000的分段错误?

时间:2019-03-28 17:01:20

标签: c

这是kernighan&ritchie的1-17问题,这是一个非常简单的问题,但是当我使用值MAXLEN = 1000进行测试时,编译器显示了分段错误,我不十分清楚为什么,因为1000似乎是一个非常合理的值,它似乎可以工作10000,但为什么呢?

#include <stdio.h>
#define MINL 80
#define MAXLEN 1000
int get_line (char s[] , int lim )
{
  int c,i,j;
  for (i=0; (c=getchar())!=EOF && c!='\n';i++)
  {
      if (i<lim-2)
      {
      s[j]=c;
       ++j;
      }}
      if (c=='\n')

      {
          s[j]=c;
          ++i;
          ++j;
      }
      s[j]='\0';

      return i;

}
int main ()
{
    int len;
    char line[MAXLEN];
    while ((len=get_line(line,MAXLEN))>0)
    {
        if (len>MAXLEN)
        {
            printf("%s",line);
        }

    }

    return 0;
}

3 个答案:

答案 0 :(得分:0)

您应该为编译器打开警告。它会向您显示j尚未初始化:

/home/user/main.c:11:15: warning: variable 'j' is uninitialized when used here [-Wuninitialized]
            s[j]=c;
              ^
/home/user/main.c:6:14: note: initialize the variable 'j' to silence this warning
    int c,i,j;
             ^
              = 0

答案 1 :(得分:0)

如前所述,变量 j 未初始化,因此,当您设置s[j]时,行为是不确定的,并且在您的情况下,您会遇到分段错误,因为您写出了数组。

实际上,您不需要该变量:

#include <stdio.h>

#define MAXLEN 10

int get_line (char s[] , int lim )
{
  int c, i = 0;

  lim -= 1;

  while ((c=getchar()) != EOF)
  {
    if (i < lim)
    {
      s[i] = c;
    }

    i += 1;

    if (c == '\n')
      break;
  }

  s[(i < lim) ? i : lim] = '\0';

  return i;
}

int main ()
{
  int len;
  char line[MAXLEN];

  while ((len = get_line(line,MAXLEN)) > 0)
  {
    /*if (len>MAXLEN)*/
    {
      printf("%d '%s'\n", len, line);
    }
  }

  return 0;
}

我更改了 MAXLEN 的值以轻松测试输入字符串是否更大的情况,以及 printf 来查看所有情况下的结果

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall g.c
pi@raspberrypi:/tmp $ ./a.out
aze
4 'aze
'
123456789
10 '123456789'
12345678
9 '12345678
'
1234567890
11 '123456789'
^C

要测试EOF情况:

pi@raspberrypi:/tmp $ echo aze | ./a.out
4 'aze
'
pi@raspberrypi:/tmp $ 

答案 2 :(得分:0)

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 消除代码布局中的混乱
  4. 消除未使用的select *, case when number happens first time then 1 else null over (partition by account order by number) from table. account number expected output abc 20 1 abc 20 0 abc 30 1 def 20 1 def 30 1 def 30 0 语句
  5. 消除不必要的变量

现在,建议的代码:

#define