gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:24:29 26 4
gpt4 key购买 nike

首先请允许我对格式和困难的代码表示歉意。我是 C 和堆栈的新手。这里的大多数困惑代码可能与问题无关,但有必要包含在上下文中。

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

NULL 内存分配的返回被故意省略,因为开发协议(protocol)明确规定所有内存分配都会成功(我对此表示怀疑)。

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

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() 可以返回 NULL,因此您为了完整性,需要处理它。

关于c - 重新分配期间出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40924775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com