问题:定义结构体指针时,有没有同时分配存储空间啊?看到结构体的数组定义好以后就直接可以用了。但是结构体指针在链表中还要malloc()申请空间。这是为什么啊?
答案:定义结构体指针时并没有分配存储空间,所以要用malloc()申请空间。
//下面仅仅是定义一个类型,不会产生变量,所以不存在分配空间的问题
struct data
{
int i;
int j;
};
void main(void)
{
struct data dat1; //定义一个struct data类型的变量,和int i同理。
printf("%d\n", sizeof(struct data)); //8个字节
printf("%d\n", sizeof(dat1)); //8个字节
struct data* pdat1;//定义一个struct data类型的指针,和int *pi 同理。
printf("%d\n", sizeof(pdat1)); //4个字节,就是一个指针的空间,pdat1并没有结构体变量的信息。
pdat1 = (struct data*)malloc(sizeof(struct data)); //申请一个空间,把该空间地址给pdat1.
printf("%d\n", sizeof(*pdat1)); //8个字节
struct data dats1[2];
printf("%d\n", sizeof(dats1)); //16个字节,两个data变量,不是data指针。
dats1[0].i = 20; //可以直接使用数组里面的结构体变量
dats1[0].j = 30;
struct data* dats2[2]; //指针数组,包含两个指针,而不是结构体变量
printf("%d\n", sizeof(dats2)); //8个字节,两个指针的大小
dats2[0]->i = 20; //错误!还没有给dats2[0] 指针分配空间
dats2[0]->i = 20; //错误!还没有给dats2[0] 指针分配空间
dats2[0] = (struct data*)malloc(sizeof(struct data)); //分配空间
dats2[0]->i = 20; //ok
dats2[0]->i = 20; //ok
}