0

関数を実装していますが、それを「ライブラリ品質」の関数にしたい:

char** str_cat(char** const  str, const char * const other ){

    if(str==NULL) 
        return NULL;
    if(other==NULL) 
        return str;
    if(*str==NULL) 
        return str_cpy(str,other);

    char* tmp=(char*)calloc(1,strlen(*str)+strlen(other)+1);
    if(tmp==NULL) 
            return NULL;
    strcat(strcpy(tmp,*str),other); 
    *str=tmp;
    return str;     
}

これは strcat() 関数 (異なる署名) のバージョンであり、極端なユース ケースを処理します。しかし、メモリ不足の障害を処理する方法は、豊富な str_xxx() API ライブラリを多用する大規模なアプリケーションには適していません。

質問: より良い解決策はありますか?

4

2 に答える 2

1

引数を変更したり解放したりせずに、代わりに新しく割り当てられた文字列を返す方がよいでしょう。

char * mycatcat(char *one, char *two)
{
size_t len1, len2;
char *new;

if (!one && !two) return NULL;
len1 = (one) ? strlen (one) : 0;
len2 = (two) ? strlen (two) : 0;

new = malloc(1+ len1+ len2);
if (!new) return NULL;

if (len1) memcpy (new, one, len1);
if (len2) memcpy (new+len1, two, len2);
new[len1+len2] = 0;

return new;
}

ところで:この関数は、文字列1または2がmalloc()によって取得されない場合にも機能するはずです。したがって、解放されるべきではありません。そのような

char *onetwo;
onetwo = my_catcat( "eins", "zwo");

動作するはずです。(さらに楽しいために引数にconstを追加してください)

于 2012-12-08T18:32:43.403 に答える
1

を返す、メモリ不足の状態をアプリケーションの責任にする、またはアプリケーションを終了する、mallocとしましょうxmalloc(または同等のもの)のラッパーをお勧めします。前者は、堅牢でポータブルなライブラリに適しています。ただし、最新のオペレーティング システムのコンテキストでは、後者が非常に合理的です。OOM エラーが発生すると、アプリは深刻な問題に陥り、いずれにしても回復できない可能性があります。いくつかのクリーンアップの実行、重要なデータの保存などを試みる可能性があります。callocNULLxmalloc

于 2012-12-08T18:00:06.370 に答える