0
点赞
收藏
分享

微信扫一扫

联合体、动态内存、柔性数组学习复盘2022-4-10

佳简诚锄 2022-04-13 阅读 49
c语言

联合体的函数为union,联合体有对齐的特性。

它与结构体不同的点为联合体有对齐的特性。

如以下计算长度的结果

联合体为4

union on
{
   char c;
   int a;
};

结构体为8

struck on
{
   char c;
   int a;
};

联合体可以在首位置叠加,这样可以在特殊地方可以节省空间。

动态内存顾名思义可以动态的增加和减少内存,可以使初始开辟不必设置过大,造成浪费。

比如实现一个通讯录,如果想储存大量数据那么初始开辟的数组必然需要设置很大,那么如果使用的人需求很少只会储存几个联系人,那么其他开辟大量空间会造成浪费,如果有人有大量的使用需求超过了设置的最大数量,那么会造成储存失败。这时动态内存就发挥了很大作用。

局部变量储存的位置在栈区,不会开辟很大的空间。

动态内存分配在堆区,用多少开辟多少不会造成浪费。

动态内存有三个函数分别为

molloc(size_t size)生成单位字节的空间,需要主动初始化

calloc(size_t num, size_t size)  可以设置生成的大小和数量,并可以初始成为0

ralloc(void* ptr, size_t size)   添加空间,生成动态内存的主要函数

这三个函数都要配合free使用,free可以释放使用的堆区空间,在栈区申请的内存可以随着局部变量的结束自动释放 ,而堆区开辟的空间不会自动释放需要主动释放,free释放之后要把指向的空间置空。

常见的动态内存错误

1.对 NULL 指针的解引用操作

2.对动态开辟空间的越界访问

3.对非动态开辟内存使用 free 释放

4.使用 free释放一块动态开辟内存的一部分

5.对同一块动态内存多次释放

6.动态开辟内存忘记释放(内存泄漏)

柔性数组

在结构体类型末尾设置一个没有大小的数组就是柔性数组

typedef struct st_type
{
 int i;
 int a[];//柔性数组成员
}type_a;

柔性数组不参与结构体大小的计算

包含柔性数组成员的结构用 malloc () 函数进行内存的动态分配,并且分配的内存应该大于结构的大

小,以适应柔性数组的预期大小。

相对于使用指针的优势是使用free释放一次就可以,而使用指针需要free两次,大大避免了忘记free的风险。

举报

相关推荐

0 条评论