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];

配列は次の時点でスコープ外になります。}つまりstr、ダングリングポインタになります。メモリを使用するmalloc()と、スコープよりも長持ちします。

于 2012-08-23T13:14:04.897 に答える
2

配列はスコープ外になり、エイリアスポインタを介してアクセスするには無効になりますstr。そのため、このソリューションは機能しません。

ただし、実際の解決策も壊れています。strそのポインタは新しく割り当てられたメモリで上書きされるため、で呼び出し元から渡されたメモリがリークされますextra

関数がで動的に割り当てられたポインターを期待している場合は、ポインターを。で上書きする前にそれstrを行う必要があります。の戻り値が新しいポインタである可能性があることを忘れないでください。そのため、関数によって返される現在のソリューションを保持してください。free()extrarealloc()realloc()str

于 2012-08-23T13:15:59.720 に答える