C99で導入された柔軟な配列メンバーを実際に使用するつもりであると仮定すると、次のようなコードを記述する必要があります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char word[30];
typedef struct {
int num;
word group[];
} paragraph;
int main(void)
{
paragraph *p = malloc(sizeof(*p) + 1 * sizeof(word));
word w = "BLA";
strcpy(p->group[0], w);
printf("Word: %s\n", p->group[0]);
free(p);
return 0;
}
それは適度にトリッキーなコードです。これが何をしているのかを理解するまで、柔軟な配列メンバーの使用は避けてください。それまではgroup
、段落のメンバーをword
:にします。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char word[30];
typedef struct {
int num;
word group;
} paragraph;
int main(void)
{
paragraph p;
word w = "BLA";
strcpy(p.group, w);
printf("Word: %s\n", p.group);
return 0;
}
重要な点は、配列を直接割り当てることはできず、文字列や他のタイプの相対配列を使用する必要があるということですstrcpy()
。一般に配列を含む構造体を割り当てることができますが(ただし、柔軟な配列メンバーを含む構造体では割り当てることができません)、構造体の割り当てを行うことができ、構造体に配列が含まれているのは偶然です。memmove()
memcpy()
しかし、単語グループの場合、group [30]を配置すると、それは残りのコードにどのように影響しますか?
あなたが尋ねるように行うコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char word[30];
typedef struct
{
int num;
word group[30];
} paragraph;
int main(void)
{
paragraph p;
word w = "BLA";
strcpy(p.group[0], w);
printf("Word: %s\n", p.group[0]);
return 0;
}
この構造では、を仮定すると、30語の配列を宣言したため、各単語は30文字の配列であることsizeof(int) == 4
がわかります。sizeof(paragraph) == 904
この構造により、段落に複数の単語を追加できます(そして、私が書いたほとんどの段落には、確かに複数の単語が含まれています!)。あなたはまだstrcpy()
単語をw
からの要素にコピーするために使用する必要がありますp.group
:
int main(void)
{
paragraph p;
word w = "BLA";
strcpy(p.group[0], w);
strcpy(p.group[1], "Porcupine");
strcpy(p.group[2], "Elephant");
p.num = 3;
printf("Word: %s\n", p.group[0]);
printf("Paragraph:");
for (int i = 0; i < p.num; i++)
printf(" %s", p.group[i]);
putchar('\n');
return 0;
}
typedef
likeを使用するのは間違いではありませword
んが、私が通常行うことではありません。それはすべて、悟りよりも混乱を招きやすいのです。また、ほとんどの単語の長さが29文字より大幅に短い場合は、メモリの浪費につながる可能性があります。(配列要素に29文字(および終了ヌルバイト)より長い単語を格納しないようにする責任はあなたにありますp.group
。)OTOH、64ビットソフトウェアでのメモリ割り当てのオーバーヘッドにより、無駄なスペースが簡単にレンダリングされる可能性があります。一言で言えば議論の余地があります。