最近看到了结构体指针的内容,发现未赋初值的结构体指针的特性很有意思,做一个文档记录一下。
首先看如下代码
#include <stdio.h>
#include <cstdlib>
#include <cstring>
int main()
{
struct PERSON{
char *name;
int age;
float salary;
} *p;
p = (struct PERSON *) malloc(sizeof(p));
//p->age = (int*) malloc(5);
//p->age = 27;
//strcpy(p->name, "marry");
printf("%d\n", sizeof(p));
printf("%d\n", &(p));
printf("%d\n", &(p->name));
printf("%d\n",&(p->age));
printf("%d\n",&(p->salary));
}
输出为
8
6422040
10556384
10556392
10556396
可以看到P和构造体内的元素的地址都已经分配了。
但是如下代码
#include <stdio.h>
#include <cstdlib>
#include <cstring>
int main()
{
struct PERSON{
char *name;
int age;
float salary;
} *p;
p = (struct PERSON *) malloc(sizeof(p));
//p->name = (char*) malloc(5);
p->age = 27;
strcpy(p->name, "marry");
printf("%d\n", sizeof(p));
printf("%d\n", &(p));
printf("%s\n", p->name);
printf("%d\n", p->age);
printf("%d\n", p->salary);
}
输出却是什么都没有。
如果加上中间给name分配内存的那一句的话
8
6422024
marry
27
0
就会输出结果。
至于原因我理解是虽然已经给指针P分配了内存,但是这个是构造体整体的内存空间。如果构造体内部还存在指针变量,则需要另外的为这个指针变量分配内存。如果构造体内不没有指针变量,则不需要分配内存就可以直接赋值。我觉得这里的构造体内部元素的指针和构造体指针没有关系导致的这个结果。我本人也是小白,如果有哪位大神知道具体原因,还请告知。