【结丹系列】 柔性数组

简介: C进阶之柔性数组

动态内存管理


柔性数组

C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。
typedef struct st_type
{
int i;
int a[];//柔性数组成员
}type_a;

柔性数组的特点

1.结构中的柔性数组成员前面必须至少一个其他成员。
2.sizeof 返回的这种结构大小不包括柔性数组的内存。
3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef struct S
{
    int n;
    int arr[];//柔性数组成员
}S;
int main() {
    struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);
    if (ps == NULL) {
        return 1;
    }
    ps->n = 100;
    int i = 0;
    for (i = 0; i < 10; i++) {
        ps->arr[i] = i;
    }
    for (i = 0; i < 10; i++) {
        printf("%d", ps->arr[i]);
    }
    struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
    if (ptr != NULL)
    {
        ps = ptr;
        ptr = NULL;
    }
    free(ps);
    ps = NULL;
    return 0;
}
//这样柔性数组成员arr,相当于获得了10个整型元素的连续空间。

image-20220723103944818

柔性数组的优点

第一个好处是:方便内存释放

如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给
用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你
不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好
了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。
第二个好处是:这样有利于访问速度.
连续的内存有益于提高访问速度,也有益于减少内存碎片。(其实,我个人觉得也没多高了,反正
你跑不了要用做偏移量的加法来寻址)

动态内存函数的介绍

2.1 mallocfree

C语言提供了一个动态内存开辟的函数:

void* malloc (size_t size);

这个函数向内存申请一块 连续可用的空间,并返回指向这块空间的指针。

如果开辟成功,则返回一个指向开辟好空间的指针。

如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。

返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己

来决定。

如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器.

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:

void free (void* ptr);

free函数用来释放动态开辟的内存。

如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。

如果参数 ptr 是NULL指针,则函数什么事都不做。

malloc和free都声明在 stdlib.h 头文件中。

相关文章
|
4月前
|
编译器 C语言
柔性数组理解
柔性数组理解
24 0
|
6月前
|
编译器 C语言 Python
柔性数组
柔性数组
23 0
|
2月前
|
编译器 C语言
C语言中柔性数组的讲解与柔性数组的优势
C语言中柔性数组的讲解与柔性数组的优势
|
4月前
|
编译器
关于柔性数组
关于柔性数组
|
9月前
|
编译器 C语言 C++
动态内存分配(3)——柔性数组
动态内存分配(3)——柔性数组
|
5月前
|
编译器 C语言
|
6月前
|
编译器 C语言
认识柔性数组
认识柔性数组
|
存储 算法 程序员
【C/C++】动态内存&柔性数组
【C/C++】动态内存&柔性数组
65 0
|
9月前
|
编译器 C语言
常见的动态内存的错误 和 柔性数组
✅<1>主页:C语言的前男友 📃<2>知识讲解:常见的动态内存的错误,以及柔性数组(C99) 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 💬<5>前言:之前我们说过动态内存管理的知识,今天我们来见识一下,动态内存管理常见的错误。帮助大家对动态内存管理有更深入的理解。
|
11月前
|
编译器 C语言
带你认识柔性数组
小编今天又给大家带来新东西了,相信柔性数组这个名词对于大部分人都比较陌生,那接下来就让我们去认识认识这个新朋友
52 0