声明和定义结构体需要注意的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/euxnijuoh/article/details/90739803
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是不存在的,所以它的存在是合法的。

猜你喜欢

转载自blog.csdn.net/euxnijuoh/article/details/90739803