私が構造体を持っているとしましょう:
typedef struct {
int number1; /* dummy */
int number2; /* dummy */
int number3; /* dummy */
char *name1;
char name2[];
} Klass;
残りのコードは次のとおりです。
int main(int argc, char const *argv[])
{
char *name1 = "this is a name"; /* 1st case */
char name2[] = "this is also a name"; /* 2nd case */
Klass k;
k.number1 = 10;
k.number2 = 20;
k.number3 = 30;
k.name1 = "this is my first name"; /* 3rd case */
/* error: invalid use of flexible array member */
k.name2 = "this is my second name";
Klass *kp = (Klass*)malloc(sizeof(Klass));
kp->number1 = 100;
kp->number2 = 200;
kp->number3 = 300;
kp->name1 = "this is also my first name"; /* 4th case */
/* error: invalid use of flexible array member */
kp->name2 = "this is my second name";
return 0;
}
- マークされたケースでメモリがどのように割り当てられるか(ヒープとスタック)を誰かが明確にできますか?
メインブロックの最後でどのようにメモリを解放する必要がありますか?コンパイラが与える理由は何error: invalid use of flexible array member
ですか?
編集
あなたが言っk.name = "this is my name";
てスタックにいる場合、私がこのようkp->name = "this is also my name";
に到達する方法を説明できますか?"this is my name"
Klass *kp;
int foo() {
Klass k;
k.number1 = 10;
k.number2 = 20;
k.number3 = 30;
k.name = "this is my name";
kp = &k;
} // k is destroyed now
int main(int argc, char const *argv[])
{
kp = (Klass*)malloc(sizeof(Klass));
foo();
printf("%d\n", kp->number1); /* segfault */
printf("%d\n", kp->number2); /* segfault */
printf("%d\n", kp->number3); /* segfault */
printf("%s\n", kp->name); /* prints "this is my name" */
return 0;
}