C 让asprintf使用也是输入的非空目标指针安全吗?
tl;dr是否可以在不调用临时指针的情况下将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); 但那很笨重 共识实现是否保
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);