比方說,我有一個結構:內存分配
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