1

構造体の配列を初期化したいのですが、memset() の 2 番目のパラメーターは int を取ります。同じことをするが、 (void *) で2番目のパラメーターを持つ別の関数はありますか? memcpy() を考えましたが、配列全体に値を設定しません。何か案が?

構造体:

typedef struct {
    int x;
    int y;
    char *data;
} my_stuff;

コード:

my_stuff my_array[];
my_array = malloc(MAX * sizeof(my_stuff));

my_stuff *tmp;
tmp->x = -1;
tmp->y = 1;
strcpy(tmp->data = "Initial state");

memset(my_array, tmp, sizeof(my_array));
4

3 に答える 3

4

memcpy()これには標準関数はありません。ループで呼び出す必要があります。

my_stuff *my_array = malloc(MAX * sizeof(my_stuff));
my_stuff tmp;
size_t i;

tmp.x = -1;
tmp.y = 1;
tmp.data = "Initial state";

for (i = 0; i < MAX; i++)
    memcpy(&my_array[i], &tmp, sizeof tmp);

strcpy()に入ることができないことに注意してくださいtmp.data。これは、メモリが割り当てられていないダングリング ポインターにすぎないためです。

于 2011-04-19T03:13:35.743 に答える
4

memset()各バイトの値を設定します。整数 (2 番目のパラメーター) へのポインターの型キャストに問題はありません。主な問題は、1 バイトよりも大きくなることです。

memset()バイト値を超える値をコピーするバージョンは知りません。このための単純なループを作成します。

また、コードが機能した場合、コードにいくつかの追加の問題があることに注意してください。たとえばsizeof(my_array)、要素数ではなく、データ構造の合計バイト数を返します。また、コードはポインターをコピーしただけです。ターゲットはポインターではなく、実際の構造であるため、実際にそれが指すデータをコピーする必要があります。

于 2011-04-19T03:15:09.743 に答える
0

この場合、memset() は使用できません。memcpy() を使用する必要があります。1. 配列を malloc する 2. 配列の最初の要素を初期化する 3. 最初の要素をすべての要素にコピーする

/* step 1 */
my_stuff *my_array = malloc(MAX * sizeof(my_stuff));
int i;

/* step 2 */
my_array[0].x = -1;
my_array[0].y = 1;
my_array[0].data = "Initial state";

/* step 3 */
for (i = 1; i < MAX; i++)
    memcpy(&my_array[i], &my_array[0], sizeof(my_array[0]));
于 2011-04-19T06:23:17.590 に答える