15

次のように定義された C 構造体があります。

struct Guest {
   int age;
   char name[20];
};

Guest変数を作成し、次を使用して初期化したとき:

int guest_age = 30;
char guest_name[20] = "Mike";
struct Guest mike = {guest_age, guest_name};

2 番目のパラメーターの初期化に関するエラーが発生しました。これは、guest_nameメンバー変数の初期化には使用できないことを示していますchar name[20]

すべてを初期化するためにこれを行うことができます:

struct Guest mike = {guest_age, "Mike"};

しかし、これは私が望むものではありません。すべてのフィールドを変数で初期化したい。Cでこれを行う方法は?

4

4 に答える 4

25

mike.nameは、構造体内の 20 バイトの予約済みメモリです。guest_name別のメモリ位置へのポインタです。guest_name構造体のメンバーに割り当てようとすると、不可能なことを試みます。

データを構造体にコピーする必要がある場合は、使用する必要がmemcpyあります。この場合、\0ターミネータを処理する必要があります。

memcpy(mike.name, guest_name, 20);
mike.name[19] = 0; // ensure termination

文字列を終了している場合\0は も使用できますがstrcpynameのサイズは 20 なので、 をお勧めしstrncpyます。

strncpy(mike.name, guest_name, 19);
mike.name[19] = 0; // ensure termination
于 2013-09-23T19:19:13.467 に答える
0

実際には、この構造体を静的に初期化できます。

struct Guest {
   int age;
   char name[20];
};

Guest guest = { 30, {'M','i','k','e','\0'}};

配列の各要素は明示的に設定する必要があり、これは c-string を使用して行うことはできません。構造体が char* 名で定義されている場合、これを行うことができます。

struct Guest {
   int age;
   char* name;
};

Guest guest = { 30, "Mike"};
于 2021-01-06T14:43:34.467 に答える
-2

C では、固定の char[] 配列を使用して構造体を静的に割り当てることができます。たとえば、gcc では次のことが可能です。

#include <stdio.h>

typedef struct {
    int num;
    char str[];
} test;

int main(void) {
    static test x={.num=sizeof("hello"),.str="hello"};

    printf("sizeof=%zu num=%d str=%s\n",sizeof(x),x.num,x.str);
    return 0;
}

そして、それは正しいことを行います(sizeof(x)に注意してください:私のマシンでは4を返します。静的に割り当てられたメモリの合計の長さではありません)。

ご想像のとおり、これはスタックから割り当てられた構造体では機能しません。

于 2016-09-05T03:17:00.880 に答える