複数レベルのポインターを使用するときに、いつ 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;
}
私が使用しているこの最初のバージョンでは、 type の割り当てスペースPerson *p
のみを使用しています。2番目のバージョンでは、次のように変更します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
別のポインターがあるにもかかわらず、私はまだ1つしか使用していません。
この 3 番目のバージョンでは、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) また、 2 番目または 3 番目のバージョンでmalloc
スペースを確保する必要がないのはなぜですか?p
3) 3 番目のバージョンでは、 の適切なサイズmalloc
は*p
? 私の 64 ビット Mac ではsizeof(void)
は 1 で、sizeof(void*)
は 8 で、どちらも動作しているように見えますが、どちらが正しいのでしょうか?