我正在尝试理解何时需要在使用多级指针时使用malloc.例如,
#include#include #include 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#include #include 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#include #include 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)另外,为什么我不需要在第2版或第3版中留出malloc
空间p
?
3)在第三个版本中,malloc
适合的尺寸是*p
多少?在我的64位Mac上,它sizeof(void)
是1,而它sizeof(void*)
是8,两者似乎都可以工作但是正确的是什么?
我将在此总结一下:
1)你需要为空间分配空间*p
.如果你用valgrind运行你的第二个程序,你会看到一个alloc size(1而不是8)的错误; *p
是指向指针的指针,但**p
不是,它是指向结构的指针.
2)你需要在两种情况下分配空间,如果你打开警告(你永远不应该关闭它),你会得到这个警告:
warning: ‘p’ is used uninitialized in this function [-Wuninitialized] *p = malloc(sizeof(Person));
3)正确的是void*
.void*
是一个指针,这意味着它的大小足以包含64位计算机中的每个内存地址.如果您的计算机使用32位系统,它可能会更小.虽然使用起来会更好
malloc(sizeof(Person*));
代替 malloc(sizeof(void*));
因为您已经知道要使用的类型.它不会改变任何计算机,但会使代码更清晰.