0

最近、char nameフィールドを動的にするいくつかのコードを変更しました。

だからもともとそうだった

struct boo 
{
    char name[100];
    ...
}

そして私はそれをに変更しました

struct boo
{
    char *name;
    ...
}

したがって、この make name は、名前を格納するために実際に必要なメモリ量を動的に割り当てます。

とにかく.. この変更の結果if(boo->name)、コードの約 1000 箇所にヌル ポインター チェックを追加する必要があります。

したがって、このヌル ポインター チェックを実行するスマートまたは効率的な方法 (プログラマーの開発時間を短縮する) があるかどうかは疑問です。

4

3 に答える 3

4

構造体が使用されている場所をチェックするよりも、構造体が作成されたときにバッファーが割り当てられていることを確認する方がはるかに簡単です。そもそも NULL にしないでください!

関連するデータを取得する前にポインター値を構造体に配置する必要がある場合は、このタスク専用に使用するグローバルな空の文字列を保持できます。freeメモリを試す前に、このポインタと比較してください。

これが C ではなく C++ である場合std::stringは、ポインタの代わりに a を使用することを真剣に検討してください。

于 2012-06-18T05:19:00.527 に答える
1

if (name) は機能しますが、最初からポインターが NULL に初期化されていない可能性があるという問題が常にあります。

構造体を動的に割り当てる場合、これが確実に行われるようにするには、次のようにします。

mystruct foo = calloc(sizeof(foo));

calloc はメモリをゼロにします。

編集:さらに、デバッグビルドで名前のみを確認したい場合は、次のことができます:

assert(name);

name が NULL の場合、これはその行でプログラムを終了しますが、「リリース」ビルドでは何も最適化されません。

于 2012-06-18T05:18:34.053 に答える
0

あなたの問題は、あなたがmalloc.

ライブラリからxmallocラッパーを使用するのが好きな人もいます:malloclibiberty

— 置換: void* xmalloc (size_t) 確実にメモリを割り当てます。malloc が失敗すると、stderr にメッセージが出力され (xmalloc_set_program_name で設定された名前があればそれを使用)、xexit が呼び出されます。したがって、プログラムのソースに #define malloc xmalloc を含めることは安全であることに注意してください。

http://gcc.gnu.org/onlinedocs/libiberty/Functions.html

xmalloc独自の関数を簡単に作成することもできます。

void *xmalloc(size_t size)
{
    char *p = malloc(size);

    if (!p) {
         fprintf(stderr, "Error: allocation failure\n");
         exit(EXIT_FAILURE);
    }        

    return p;
}
于 2012-06-18T07:42:52.313 に答える