在C语言中使用双指针(char**)与(char*)的优点?

在C语言中使用双指针(char**)与(char*)的优点?,c,pointers,C,Pointers,我试图用以下原型实现一个功能。 int get_next_line(const int fd, char **line) . 第一个参数是将用于读取的文件描述符 第二个参数是指向将要使用的字符的指针的地址 保存从文件描述符读取的行 关于传递引用和传递值的区别,我只知道引用允许修改内容值。 但是对于给定的原型,我们有第一个字符的地址,所以我不完全理解双指针的必要性 [编辑]:我们将一行字符存储在'**行'中 我的问题是: 为什么使用**行而不是*行,或者为什么不使用 int get

我试图用以下原型实现一个功能。

int     get_next_line(const int fd, char **line) .   
第一个参数是将用于读取的文件描述符

第二个参数是指向将要使用的字符的指针的地址 保存从文件描述符读取的行

关于传递引用和传递值的区别,我只知道引用允许修改内容值。 但是对于给定的原型,我们有第一个字符的地址,所以我不完全理解双指针的必要性

[编辑]:我们将一行字符存储在'**行'

我的问题是:

为什么使用**行而不是*行,或者为什么不使用

int get_next_line(int fd, char **line);
这是一个可用的函数。它可能会分配一个暂时足够大的字符数组,在其中读入一行,重新分配并在必要时读取余数,然后通过将分配的字符串分配给未引用的第二个参数(
*line=allocated_string;
)将其传递回


这显然是胡说八道。无法编写与前一行一样远程可用的
get_next_line
。它无法确定传递给它的字符数组的大小,也无法重新分配此数组。指定此函数使其行为合理的唯一方法是要求参数必须是在别处指定的某个预定义大小的数组。这只能在一些非常狭窄的环境中有用

请注意,这不是一个立即明显的观察结果。在2011年之前,C语言一直使用
。以前程序员在工作时很粗心


这可能是一个有用的函数。它几乎可以像标准的
read
函数一样工作,只是它不会读取超过行的第一个结束字符。(或者像Posix fike句柄的
fgets
)当然,用户需要处理输入行比其数组长的情况。假设
get\u next\u line
将在扫描字符时返回数字



注意
const int
在函数原型中是无用的。在这种情况下,所有标准函数都指定
int

这是什么问题?这就像在C中使用
char
vs
float
的优点是什么?这是不同的类型,一种是指向字符串的指针,另一种是字符串或字符数组。很抱歉,我忘了提到我们将在*行(字符数组)中只存储一个字符串。在这种情况下,它有点像C版本的OUT或INOUT参数。星星越多,指针就越豪华。唯一的疑问是,当且仅当
line
在函数调用之前有足够的存储空间时,第二种形式才可用。它只是将指针的副本传递到
get\u next\u line
,以便从描述符填充。(这并不是说它是首选形式).@DavidC.Rankin所以就像
获取
。它是在2011年从tge标准版启动的,但您可能会喜欢这样一个事实,即明智的Unix管理员早在1988年就开始将其从libc副本中丢弃(请参阅“Morris worm”)。我肯定遗漏了一些东西,因为它与
gets
没有关联。一个简单的
#define
(与
的存储大小相同)可以为
中的
的边界提供完全有效的保护。我遗漏了什么?@DavidC.Rankin所以“其他地方指定了一些预先确定的尺寸”。需要同时提供
get_next_line
#define
,这需要为
#define
d常量提供一个合理的值。正如我所说的,任何这样的事情“只能在一些非常狭窄的环境中有用”(很抱歉有太多的自我引用)。谢谢你,这似乎有助于我理解这个概念,我将尝试模拟这个问题以完全理解。
int get_next_line(int fd, char *line);
int get_next_line(int fd, char *line, size_t size);