版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1、为什么不能在声明 结构体的时候直接给成员变量赋声明?
(1)声明变量
uint8_t i;
(2)声明函数
void func(void);
(3)声明变量类型
typedef int int32_t
(4)结构体的声明
struct Node{
uint8_t i;
uint32_temp;
};
(5)联合体的声明
union Test{
uint8_t i;
uint32_temp;
};
问题分析:
在上面声明的过程中,所有看似din定义的东西都不能被赋值,因为它们只是向计算机说明了一下,我有这么个东西,而不是真正的定义。如果你进行了定义,那么要么被忽略,要么就警告甚至报错。一定要能区分声明和定义。声明的时候,计算机没有为它分配空间,只有定义了,才有空间。所以你是无法为没有空间的东西赋值的。例如下面这种写法:
struct Node{
uint8_t i = 10;
uint32_temp = 5;
};
就是不合法的。因为此时只是声明,没有定义变量,自然没空间,所以这种写法不合法。
要给i和temp赋值,必须有结构体变量,例如写成:
第一种方法:
struct Node{
uint8_t i ;
uint32_temp;
};
struct Node node;
node.i=10;
node.temp = 5;
第二种方法:
struct Node{
uint8_t i ;
uint32_temp;
}node;
node.i = 10;
node.temp=5;
以上两种写法,都是合法的。
2、结构体里为什么不能定义自己,而只能定义自己的指针?
如果写成:
struct Node
{
uint8_t data;
struct Node next;
};
那么你会发现,这个结构体将会不知道自己有多大。如果我们用它定义了一个变量:
struct Node node;
那么,这个node里有个next,也就是node.next,node.next里还有个next,以此类推,node.next.next.next.next……无穷无尽了。所以这样的结构会导致计算机无法判断它的大小。
而如果我们写成指针:
struct Node
{
uint8_t data;
struct Node *next;
};
那么任何指针的大小都是一定的(32位编译器下是4字节,64位编译器下是8字节),所以这个结构体可以确定大小。如果我们用它定义了一个变量:
struct Node node;
那么此时,node.next是野指针,在你给它分配空间之前,node.next->next是不存在的,所以它的存在是合法的。