比方说,我有一个结构:内存分配
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;
}
- 任何人都可以澄清我如何记忆被分配(堆vs堆栈)在标记的情况下?
-
我应该如何在主块的末尾释放内存? -
编译器给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;
}
请一次提出一个问题。那里有三种不同的东西,其中前两种已经被问及过无数次了。 – Mat
3.的原因是你不能分配给数组。这是一个灵活的阵列成员是偶然的。 –
@Mat我很想看到这些问题的链接,以便我可以解释为什么这些答案不适用于我.. – none