0
typedef struct unit_class_struct {
    char *name;
    char *last_name;
} person;


int setName(person *array) {

    array[0].name = strdup("Bob");
    array[1].name = strdup("Dick");

    return 1;
}

int setLastName(person *array) {

    array->last_name = strdup("Sanchez");
    array++;
    array->last_name = strdup("Clark");

    return 1;
}

int main()
{
    person array[10];
    person *pointer;
    pointer = array;
    setName(pointer);
    setLastName(pointer);
    printf("First name is %s %s\n", array[0].name, array[0].last_name);
    printf("Second name is %s %s\n", array[1].name, array[1].last_name);
    while(1) {}
    return 0;
}

これは、構造をいじくり回すために私が思いついたサンプルコードです。setNameで名前を設定する方法とsetLastNameで名前を設定する方法に注意してください。

どちらも機能しますが、2つの方法の違いは何ですか?

片方がもう片方よりも優れていますか?

この例でもstrdupは必要ですか?そうでない場合は、array.nameを文字列リテラルではなくランダムなサイズの変数に設定する必要がありますか?

4

4 に答える 4

1

すべての.nameを文字列定数に設定する場合、いいえ、strdup厳密には必要ありません。後で文字列を変更する場合に必要になります。ポインタとメモリ管理のより良い基礎は、区別を明確にするでしょう。を使用する場合は、後で結果strdupを確認してください。free

于 2009-11-28T05:53:26.767 に答える
1

配列の長さがわからないため、どちらのオプションも非常に危険です。その結果、array++またはarray[1]の結果にアクセスすると、未定義の動作が発生する可能性があります。

おそらくあなたはこのアプローチを試すことができます

int set_last_name(person* array, char* lastnames[],size_t amount){
    int i=0;

    for(;i<amount;i++,array++){
      strncpy(array->lastname,lastnames[i],strlen(lastnames[i]));
    }

     return 1;
 }

ここで、amountはlastnames配列の長さです。

strdupの使用法がないことに注意してください。この関数は、ユーザーが姓と配列にメモリを割り当てることを期待します。次に、必要に応じて、ユーザーはそのメモリを解放する必要があります。strdupはヒープに割り当てられた文字列を返すため嫌いです。関数の場合は、関数のユーザーがそれを解放する必要があることを明確に文書化する必要があります。

于 2009-11-28T05:56:10.310 に答える
0

私の意見では、インデックス付きアプローチを使用することは、ポインタ演算を使用するよりもわずかに明確ですが、どちらも機能します。コンパイラがそれぞれに対して生成するコードは、どちらの場合も非常に似ていると思います。

strdupこの場合、構造体に文字列値を保存するためのメモリを割り当てないため、変数を操作している場合に必要ですperson。いずれかのセッターが呼び出されたときにこれらの文字列にすでにスペースを割り当てている場合は、strcpystrcpy_sできれば)で十分です。

例のようにリテラルを操作する場合は、strdup必要ありません。に直接割り当てることができますchar*

于 2009-11-28T05:53:14.873 に答える
0

array->nameとまったく同じ(*array).nameです。

どちらの関数でも、「配列」は構造体へのポインタであるため、とは両方とも*array構造array[0]体であり、それらのメンバーを設定できます。矢印表記は、よく使用されるショートカットです。

于 2009-11-28T12:31:16.360 に答える