Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的分段错误。原因是什么?_C - Fatal编程技术网

C中的分段错误。原因是什么?

C中的分段错误。原因是什么?,c,C,我在C语言中遇到了分段错误,我不知道原因是什么。据我所知,当系统运行我们的内存时会出现分段故障。我检查了我的循环,它们似乎有明确的终止条件。因此,我不知道是什么导致我的代码崩溃。当我检查时,这个错误应该发生在mygetline或readlines函数中。 是否有任何调试器可用于查找程序崩溃的原因 #include <stdio.h> #include <string.h> #define MAXLINE 100 #define MAXLINENUM 10 int rea

我在C语言中遇到了分段错误,我不知道原因是什么。据我所知,当系统运行我们的内存时会出现分段故障。我检查了我的循环,它们似乎有明确的终止条件。因此,我不知道是什么导致我的代码崩溃。当我检查时,这个错误应该发生在mygetline或readlines函数中。 是否有任何调试器可用于查找程序崩溃的原因

#include <stdio.h>
#include <string.h>
#define MAXLINE 100
#define MAXLINENUM 10

int readlines(char *lines[]);
int mygetline(char line[]); /* getline: read a line into s, returns length */
void writelines(char *lines[], int nlines);

int main()
{

int i = 0;

char *lines[MAXLINE];
i = readlines(lines);
writelines(lines, i);

return 0;
}

int mygetline(char line[]){
    int i, c;

    for(i = 0; i < MAXLINE-1 && (c = getchar()) != '\n' && c != EOF; i++){
        line[i] = c;
    }
    line[i] = '\0';
    return i;
}

int readlines(char *lines[]){

    int i, c;
    i = 0;

    while((c = mygetline(lines++)) > 0 && i < MAXLINENUM){ //line[i]
        i++;
    }

    lines[--i] = '\0';
    return i;
}

void writelines(char *lineptr[], int nlines) {
    int i;
    for (i = 0; i < nlines; i++) 
        printf("%s\n", lineptr[i]);
}
#包括
#包括
#定义MAXLINE 100
#定义MAXLINENUM 10
int readlines(字符*行[]);
int mygetline(字符行[]);/*getline:将一行读入s,返回长度*/
无效写线(字符*行[],整数行);
int main()
{
int i=0;
字符*行[MAXLINE];
i=读取行(行);
书写线(行,i);
返回0;
}
int mygetline(字符行[]){
int i,c;
对于(i=0;i0&&i
分段错误的原因是您没有为字符串分配任何存储空间。您可以在此处声明一个
char*
数组:

char *lines[MAXLINE];
但是没有任何地方可以分配内存来保存实际的字符串

要继续使用以这种方式分配的
char*
数组,您需要使用
malloc
为实际字符串分配内存

lines[i] = malloc(...);
显然,您需要:

  • 决定为每个字符串分配多少内存
  • 调用
    free
    以在使用完内存后将其释放
  • 添加一些代码以检查您的写操作是否超出任何缓冲区的末尾

    • 分段错误的原因是您没有为字符串分配任何存储空间。您可以在此处声明一个
      char*
      数组:

      char *lines[MAXLINE];
      
      但是没有任何地方可以分配内存来保存实际的字符串

      要继续使用以这种方式分配的
      char*
      数组,您需要使用
      malloc
      为实际字符串分配内存

      lines[i] = malloc(...);
      
      显然,您需要:

      • 决定为每个字符串分配多少内存
      • 调用
        free
        以在使用完内存后将其释放
      • 添加一些代码以检查您的写操作是否超出任何缓冲区的末尾

      出现segfault的原因是代码将数据读入行中,而没有为读取的字符分配任何内存

      您的
      main
      为字符串指针分配内存,但不会初始化这些指针。您需要添加代码来设置这些指向有效内存块的指针,例如,通过malloc分配一些最大字符数:

      while(i < MAXLINENUM) {
          lines[i] = malloc(MAXLINE);
          if (!mygetline(lines[i++])) {
              break;
          }
      }
      
      while(i

      还要注意,在
      的声明中将
      MAXLINE
      MAXLINENUM
      混淆。出现segfault的原因是代码将数据读取到行中,而没有为读取的字符分配任何内存

      您的
      main
      为字符串指针分配内存,但不会初始化这些指针。您需要添加代码来设置这些指向有效内存块的指针,例如,通过malloc分配一些最大字符数:

      while(i < MAXLINENUM) {
          lines[i] = malloc(MAXLINE);
          if (!mygetline(lines[i++])) {
              break;
          }
      }
      
      while(i

      还请注意,在
      的声明中将
      MAXLINE
      maxlineum
      混淆,您创建了一个数组
      char*lines[MAXLINE]
      ,它是指针数组。但是,您尚未初始化这些指针,因此它们指向垃圾。然后将垃圾指针传递到
      mygetline
      中,这就是问题所在


      您不仅需要为要存储的行分配内存,还需要获取它可以读取的字符数。如果您为10个字符分配了空间,但用户输入了20个字符,您将遇到类似的问题。

      您创建了一个数组
      char*lines[MAXLINE]
      ,这是一个指针数组。但是,您尚未初始化这些指针,因此它们指向垃圾。然后将垃圾指针传递到
      mygetline
      中,这就是问题所在


      您不仅需要为要存储的行分配内存,还需要获取它可以读取的字符数。如果为10个字符分配了空间,但用户输入了20个字符,则会出现类似问题。

      分段错误的原因是内存分配。 不能像
      char*行[MAXLINE]那样分配内存

      请尝试以下代码 如果您使用的是1D阵列

      char *lines;
      lines=(char *)malloc(MAXLINE*sizeof(char));
      
      如果您使用的是2D数组,请使用此代码

      char **lines;
      lines=(char **)malloc(MAXLINENUM*sizeof(char *));
      for(i=0;i<MAXLINENUM;i++)
      lines[i]=(char *)malloc(MAXLINE*sizeof(char));
      
      char**行;
      lines=(char**)malloc(MAXLINENUM*sizeof(char*);
      
      对于(i=0;i分段错误的原因是内存分配。 不能像
      char*行[MAXLINE];
      那样分配内存

      请尝试以下代码 如果您使用的是1D阵列

      char *lines;
      lines=(char *)malloc(MAXLINE*sizeof(char));
      
      如果您使用的是2D数组,请使用此代码

      char **lines;
      lines=(char **)malloc(MAXLINENUM*sizeof(char *));
      for(i=0;i<MAXLINENUM;i++)
      lines[i]=(char *)malloc(MAXLINE*sizeof(char));
      
      char**行;
      lines=(char**)malloc(MAXLINENUM*sizeof(char*);
      
      对于(i=0;i)您当然可以使用调试器。为什么不这样做呢?您有一个指针数组。但是这些指针没有指向有效内存,而您正在读取它们。这就是问题所在。您的整个内存分配方案似乎都错了。您可以通过更改
      char*lines[MAXLINE]