|
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。
一、结构体的四种声明方式
方式1:先声明结构体名,后声明结构变量名
struct 结构体名{
成员变量/数组类型标识 成员变量/数组名;
};
struct 结构体名 结构体变量名;
方式2:同时声明结构体名和结构变量名
struct 结构体名{
成员变量/数组类型标识 成员变量/数组名;
} 结构变量名;
方式3:只声明结构变量名,不声明结构体名(后续无法再声明该结构体类型变量)
struct {
成员变量/数组类型标识 成员变量/数组名;
} 结构变量名;
方式4:使用typedef先声明结构体名,后声明结构体变量(结构体名1可以被省略)
struct {
成员变量/数组类型标识 成员变量/数组名;
} 结构变量名;体名2;
结构体名2 结构体变量名;
struct 结构体名1 结构体变量名;
二、结构体变量中成员的引用方式
结构体变量名.成员名
也可以用代表结构体变量首地址的指针(p)来引用成员:
(*p).成员名 或者 p->成员名
三、动态内存分配与释放
使用动态分配优势:可以灵活控制内存使用,提高内存的利用率;可以跨函数使用内存 (因为必须手动释放)。
劣势:当忘记释放内存时,将导致内存泄漏;代码稍微复杂一些。
使用 malloc() 函数的都可以称为动态分配内存, 如:
int *ptr=(int *)malloc(sizeof(int)*5); 说明:强制转换类型,与括号中一致。malloc(整型参数) 函数返回第一个字节的地址给ptr指针变量。
使用 free() 函数实现对动态内存的释放, 如:
free(ptr); 说明:把ptr所代表的动态分配的内存释放。
使用 realloc()函数修改内存空间,如:
(int *)realloc(ptr,sizeof(int)*N); 说明:<1>如果有足够空间用于扩大,则分配额外内存,并返回地址。
<2>如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块内存。并把原来大 小内存空间中的内容复制过去。返回新的指针。(数据被移动了)。
因此,若realloc成功,指向原内存地址的指针就成了悬挂指针,即指针指向了一块没有分配给用户使用的内存,如果再用该指针进行操作就可能发生意想不到的问题。所以在应用realloc函数是应当格外注意这种情况。 |
|