vsprintf的奇怪行为

时间:2012-08-23 13:11:03

标签: c

由于这一行代码,我一直在拔头发。 如果我没有为额外的内容动态分配内存(只需加上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;
}

2 个答案:

答案 0 :(得分:2)

如果您使用:

char extra[*cur_size + 1];

数组将在下一个}范围之外,这意味着str将是一个悬空指针。使用malloc()时,内存超出了范围。

答案 1 :(得分:2)

数组超出范围,无法通过别名指针str进行访问,这就是该解决方案无法正常工作的原因。

你的实际解决方案也被破坏了:它泄漏了str中调用者传入的内存,因为该指针只会被新分配的内存extra覆盖。

如果你的函数期望在str中有一个动态分配的指针,那么在用free()覆盖指针之前你应该extra。您可能还想查看realloc(),如果是这样,请记住realloc()的返回值可能是指针,因此请将当前解决方案保留在str由函数返回。