【发布时间】:2019-11-24 21:42:47
【问题描述】:
第 1 部分
int main(int argc, char **argv)
{
int fd;
int i;
char *line;
if (!(fd = open(argv[1], O_RDWR | O_CREAT)))
{
printf("Error in open\n");
return (0);
}
while ((i = get_next_line(fd, &line)) > 0)
{
printf("%i-%s\n",i, line);
free(line);
}
printf("%i-%s",i, line);
free(line);
}
第 2 部分
int main(int argc, char **argv)
{
int fd;
int i;
char **line;
if (!(fd = open(argv[1], O_RDWR | O_CREAT)))
{
printf("Error in open\n");
return (0);
}
while ((i = get_next_line(fd, line)) > 0)
{
printf("%i-%s\n",i, *line);
free(*line);
}
printf("%i-%s",i, *line);
free(*line);
}
第 1 部分和第 2 部分之间有什么区别吗,它们之间的区别是一个使用 **line 而另一个只是 *line。
根据我的理解,两者应该是一样的。
我正在使用它们来测试我自己的函数实现,该函数读取并返回 1 行。
问题:
第 1 部分测试工作正常。 第 2 部分测试导致 分段错误
get_next_line() 的实现对两者保持相同。
【问题讨论】:
-
显示
get_next_line()的定义 -
在第二种情况下,
line是一个未初始化的值。您没有显示get_next_line,但我认为它需要一个有效的指针而不是未初始化的指针。也就是说,第一种情况下的&line是有效地址,而第二种情况下的line具有未定义的值。
标签: c pointers double-pointer