C 让asprintf使用也是输入的非空目标指针安全吗?

C 让asprintf使用也是输入的非空目标指针安全吗?,c,alias,stdio,C,Alias,Stdio,tl;dr是否可以在不调用临时指针的情况下将asprintf简单地用于连接 GNU引入的函数asprintf,并在其他几个clib实现中采用,对于使用类似 int i=0; char *str = strdup(argv[i]); while (argv[++i]) { asprintf(&str,"%s %s",argv[i],str); // <=== This line } asprintf(&str,"%s\n",str); 但那很笨重 共识实现是否保

tl;dr是否可以在不调用临时指针的情况下将
asprintf
简单地用于连接


GNU引入的函数
asprintf
,并在其他几个clib实现中采用,对于使用类似

int i=0;
char *str = strdup(argv[i]);
while (argv[++i]) {
   asprintf(&str,"%s %s",argv[i],str);   // <=== This line
}
asprintf(&str,"%s\n",str);
但那很笨重

共识实现是否保证了第一个代码示例的安全性和正确性?

是不是到处都在泄漏内存

是的

char *str = strdup(argv[i]);
这里,
str
包含一个指向
malloc()
ated内存的指针,该内存应该是
free()
d


这里,
asprintf()
修改
str
,使其指向由函数本身分配的其他内存。现在,您刚刚丢失了指向
strdup()
ped字符串的指针,因此发生了泄漏。

这取决于天气
asprintf
使用
realloc
(例如,
getline
)。从主页上看不清楚是否应该这样做。只需在上面引用的段落中添加工作“new”就可以非常清楚地说明这一点,但没有它…@dmckee我能找到的最接近的手册页是OS X。它说:“
asprintf()
vasprintf()
使用
malloc(3)
动态分配一个新字符串”——因此在我看来,这意味着调整缓冲区的大小需要调用
realloc()
。它必须是一个比我更新的Mac OS,但这正是我要找的词。笨重的版本是:叹气::“从主页上看,它不清楚是否应该。”——从主页上看,它非常清楚。。。你只是读得很糟糕。“笨重的版本”--如果您没有毫无意义地将
newstr
初始化为NULL,它会稍微不那么笨重。而
free
是一个函数——调用它需要括号。@dmckee要说明要点:
ret
是一个out参数--
*ret
已设置,但其值从未使用过。您可以从文档中确定这一点,因为。。。它表示设置了
*ret
,并且从不使用其值。因此,
realloc
ing这是不可能的。顺便说一句,好问题+1.
asprintf
不是标准函数,它是GNU扩展。“是不是到处都在泄漏内存?”--当然是。医生说要释放内存,但你没有
asprintf
不可能
realloc
它的第一个参数——这是一个out参数,不能假设它的内容。@JimBalter…是的。这是正确的。虽然它们也可以在Mac OS现在使用的BSD库中找到。编辑如下。如果将非空指针传递给
asprintf
,则调用
malloc
将覆盖该指针。它不使用预先分配的内存。“我倾向于假设函数像getline一样使用realloc。”——做出这样的假设是完全错误的,因为
getline
文档详细说明了
lineptr
参数的值是如何使用的。只要比较一下文档,很明显,
asprintf
的工作方式不同。。。它从不使用先前的值
*ret
char *str = strdup(argv[i]);
asprintf(&str, "%s %s", argv[i], str);