0

由于这 1 行代码,我一直在拔头发。如果我不为额外的内存动态分配内存(仅通过 char extra[*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;
}
4

2 回答 2

2

如果您使用:

char extra[*cur_size + 1];

数组将在 next 超出范围},这意味着str将是一个悬空指针。当您使用malloc()内存时,范围会超过范围。

于 2012-08-23T13:14:04.897 回答
2

该数组超出范围,无法通过别名指针访问str,这就是该解决方案不起作用的原因。

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

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

于 2012-08-23T13:15:59.720 回答