我的一个函数中有这个if
语句,当我用gdb
查询它时,它似乎返回了一个有效的结果,但它最终仍然给了我一个segfault
。
这是有问题的函数:
/* reads the file and adds each word to the trie
returns the number of unique words in the file */
int read_file(FILE *in, T_node *root, int *max_len)
{
char *word = NULL;
int num_unique = 0;
int len;
max_len = 0;
if(root == NULL)
{
perror("Bad root");
exit(3);
}
while ((word = read_long_word(in)) != NULL)
{
len = strlen(word);
/************ segfault here ***********/
if (len > *max_len)
{
*max_len = len;
}
num_unique += add_word(root, word);
}
return num_unique;
}
这是我运行它的地方:
/* tests file with some repeated words */
void test_read_file2(void)
{
FILE *in = fopen("repeated.txt", "r");
T_node *root = create_T_node();
int max_len = 0;
/****** segfault caused by this call *****/
checkit_int(read_file(in, root, &max_len), 8);
checkit_int(max_len, 19);
free_trie(root);
fclose(in);
}
这是我从gdb
得到的:
27 if (len > *max_len)
(gdb) p len
$4 = 5
(gdb) p *max_len
$5 = 0
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x0000000000402035 in read_file (in=0x605010, root=0x605250,
max_len=0x7fffffffe0dc) at fw.c:27
27 if (len > *max_len)
(gdb) p *max_len
$6 = 0
(gdb) p len > *max_len
$7 = 1
正如您在上面看到的,当我打印if
条件时,它返回true
很好,但无论如何我在那行 (27( 上得到了分割错误。我错过了什么?
int read_file(FILE *in, T_node *root, int *max_len)
max_len
是指针
max_len = 0;
此行使max_len
为空指针。
*max_len = len;
在这里,您尝试取消引用空指针。
将max_len
的启动更改为
*max_len = 0;