重新分配期间出现分段错误

segmentation fault during realloc

首先请允许我对格式和难懂的代码表示歉意。我是 C 和 Stack 的新手。这里的大部分混乱代码可能与问题无关,但有必要包含在上下文中。

下面的代码在第一次调用 realloc 后遇到了分段错误(在注释中注明)。 return_file->target_line只是一个3D数组,i是3D数组第一维的元素数。所以我在它上面调用 realloc 来存储额外的二维数组(char ** 类型)。

NULL returns 的内存分配被故意省略 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;
}

realloc() 期望它的第一个参数指向一个有效的内存块或 NULL,所以在 malloc() 之后你应该初始化:

return_file = malloc(sizeof(Mockfile));
return_file->rule_count = 0;
return_file->target_line = NULL; /* Add this */

这应该可以解决崩溃问题。

另请注意,foo = realloc(foo, N); 是一个错误,因为 realloc() 可以 return NULL,因此您需要处理它以确保完整性。