realloc过程中的分段错误

realloc过程中的分段错误,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,首先,请允许我为格式和困难的代码道歉。我不熟悉C和Stack。这里大部分混乱的代码可能与问题无关,但必须包含在上下文中 下面的代码在注释中提到的第一次调用realloc后出现分段错误。return\u file->target\u line只是一个3D数组,i是3D数组第一维的元素计数。所以我在上面调用realloc来存储char**类型的额外2D数组 内存分配的空返回被故意省略了b/c开发协议明确规定所有内存分配都会成功,对此我有怀疑 我正在使用我自己的内存检查程序。我得到的错误代码是: Pr

首先,请允许我为格式和困难的代码道歉。我不熟悉C和Stack。这里大部分混乱的代码可能与问题无关,但必须包含在上下文中

下面的代码在注释中提到的第一次调用realloc后出现分段错误。return\u file->target\u line只是一个3D数组,i是3D数组第一维的元素计数。所以我在上面调用realloc来存储char**类型的额外2D数组

内存分配的空返回被故意省略了b/c开发协议明确规定所有内存分配都会成功,对此我有怀疑

我正在使用我自己的内存检查程序。我得到的错误代码是:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ac63fb in reallochook () from /lib64/libc.so.6
我已经看了很长时间,但似乎找不到问题所在

Mockfile *read_mockfile(const char filename[]) {
  Mockfile *return_file = NULL;
  FILE *input;

  if(filename != NULL && (input = fopen(filename, "r")) != NULL) {
    char **split_tmp, line[MAX] = {0};

    return_file = malloc(sizeof(Mockfile));
    return_file->rule_count = 0;

    /*read lines*/
    while(fgets(line, MAX, input) != NULL){
      if(line[0] != '#' && line[0] != '\n'){
        int j, i = return_file->rule_count;
        split_tmp = split(line);

        if(line[0] != '\t'){
          j = 0;


          /*target line. Realloc every string in three steps. Segementation fault occurs after this line below.*/
          return_file->target_line = realloc(return_file->target_line, (i + 1) * sizeof(char **));

          while(split_tmp[j] != NULL){
            return_file->target_line[i] = realloc(return_file->target_line[i], (j + 1) * sizeof(char *));
            return_file->target_line[i][j] = malloc(strlen(split_tmp[j]) + 1);
            strcpy(return_file->target_line[i][j], split_tmp[j]);
            j++;
          }
          return_file->target_line[i] = realloc(return_file->target_line[i], (j + 1) * sizeof(char *));
          return_file->target_line[i][j] = NULL;
        } else {
          j = 0;

          /*action line. Allocate every string in three steps*/
          return_file->action_line = realloc(return_file->action_line, (i + 1) * sizeof(char **));

          while(split_tmp[j] != NULL){
            return_file->action_line[i] = realloc(return_file->action_line[i], (j + 1) * sizeof(char *));
            return_file->action_line[i][j] = malloc(strlen(split_tmp[j]) + 1);
            strcpy(return_file->action_line[i][j], split_tmp[j]);
            j++;
          }
          return_file->action_line[i] = realloc(return_file->action_line[i], (j + 1) * sizeof(char *));
          return_file->action_line[i][j] = NULL;

          return_file->rule_count++;
        }
      }
    }
    fclose(input);
  }
  return return_file;
}
期望其第一个参数指向有效内存块或NULL,因此在malloc之后,您应该初始化:

return_file = malloc(sizeof(Mockfile));
return_file->rule_count = 0;
return_file->target_line = NULL; /* Add this */
这应该可以解决这场崩溃


还要注意foo=reallocfoo,N;是一个bug,因为realloc可以返回NULL,所以为了完整性,您需要处理它。

这背后的原因是什么?是否需要其他分配功能?i、 malloc和calloc?你指的是哪一个?C标准定义了行为;空返回值检查当然对malloc也是必要的,但原因不同。@MD XF,你是说大括号不在新行上吗?b/c这是我有意保留的个人偏好。任何适合你的。。。对你有用。但是有一些关键的改进需要做,一些小细节会产生很大的不同