我试图了解在使用多个级别的指针时何时需要使用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
来为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)为什么第三版中的
malloc
需要**p
空间,但malloc
不需要*p
空间?它们都是指针的指针吗?2)另外,为什么在第二版或第三版中我不需要
malloc
的p
空间?3)在第三个版本中,
malloc
的*p
正确大小是多少?在我的64位Mac上,sizeof(void)
为1,而sizeof(void*)
为8,两者似乎都可以使用,但是正确的是什么?
最佳答案
*p
)会在任何情况下引起未定义的行为。 sizeof
运算符将其指向的大小分配给它的内存。后一种情况是1.的唯一异常(exception),它允许对*p
进行编码。 所以第三个例子看起来像这样
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char first[10];
char last[10];
} Person;
int main(void) {
Person ***p;
p = malloc(sizeof *p);
*p = malloc(sizeof **p);
**p = malloc(sizeof ***p);
strcpy((**p)->first, "John");
strcpy((**p)->last, "Doe");
printf("First: %s Last:%s\n", (**p)->first, (**p)->last);
free(**p);
free(*p);
free(p);
return 0;
}
关于c - malloc和指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34470723/