由于这一行代码,我一直在拔头发。 如果我没有为额外的内容动态分配内存(只需加上char [* cur_size + 1];),vsprintf就会卡住。
char *append(char *str, int *cur_size, char *fmt, ...) {
va_list args;
va_start(args, fmt);
int len = vsnprintf(NULL, 0, fmt, args) + strlen(str);
if (len > *cur_size) {
//alloc more memory
*cur_size = len * sizeof (char) << 1;
char *extra = malloc(*cur_size+1);
// char extra[*cur_size+1]; will cause problem
strcpy(extra, str);
str = extra;
}
vsprintf(eos(str), fmt, args);
va_end(args);
LOGE("len = %d, cur_size = %d", len, *cur_size);
return str;
}
答案 0 :(得分:2)
如果您使用:
char extra[*cur_size + 1];
数组将在下一个}
范围之外,这意味着str
将是一个悬空指针。使用malloc()
时,内存超出了范围。
答案 1 :(得分:2)
数组超出范围,无法通过别名指针str
进行访问,这就是该解决方案无法正常工作的原因。
你的实际解决方案也被破坏了:它泄漏了str
中调用者传入的内存,因为该指针只会被新分配的内存extra
覆盖。
如果你的函数期望在str
中有一个动态分配的指针,那么在用free()
覆盖指针之前你应该extra
。您可能还想查看realloc()
,如果是这样,请记住realloc()
的返回值可能是新指针,因此请将当前解决方案保留在str
由函数返回。