我试图了解在使用多级指针时何时需要使用 malloc。例如,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
typedef struct {
char first[10];
char last[10];
} Person;
Person *p;
p = malloc(sizeof(Person));
strcpy(p->first, "John");
strcpy(p->last, "Doe");
printf("First: %s Last:%s\n", p->first, p->last);
return 0;
}
在我使用的第一个版本中Person *p
,我只用于malloc
为 type 分配空间Person
。在第二个版本中,我将更Person *p
改为Person **p
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
typedef struct {
char first[10];
char last[10];
} Person;
Person **p;
*p = malloc(sizeof(Person));
strcpy((*p)->first, "John");
strcpy((*p)->last, "Doe");
printf("First: %s Last:%s\n", (*p)->first, (*p)->last);
return 0;
}
malloc
即使现在有另一个指针,我仍然只使用一个。
在第三个版本中,我将使用Person ***p
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
typedef struct {
char first[10];
char last[10];
} Person;
Person ***p;
*p = malloc(sizeof(void));
**p = malloc(sizeof(Person));
strcpy((**p)->first, "John");
strcpy((**p)->last, "Doe");
printf("First: %s Last:%s\n", (**p)->first, (**p)->last);
return 0;
}
我的问题:
1) 为什么我需要在第 3 版中留出malloc
空格**p
,但我不需要留出malloc
空格*p
?它们都是指向指针的指针?
2)另外,为什么我不需要在第二版或第三版中留出malloc
空间?p
3) 在第三个版本中,适合的尺寸malloc
是*p
多少?在我的 64 位 Mac 上,sizeof(void)
是 1,sizeof(void*)
是 8,两者似乎都可以工作,但什么是正确的?