Learning c language(1): dynamic memory management

相关函数

  1. void* malloc(size_t byte): 开辟动态空间
     e.g:int* a = (int*)malloc(40)
  2. void* calloc(size_t, size_t num )
  3. void* realloc(void* ptr, size_t byte ):重新分配

注意:如果空间开辟失败,则会返回NULL

二 规范流程

  1. realloc应用临时指针接收返回值 防止开辟失败导致NULL覆盖原指针;
  2. 要记得free释放空间并指针置空 避免内存泄漏和野指针;

三 柔性数组

1. 定义

柔性数组,也称为伸缩性数组成员,是C99标准中引入的一种结构体特性。它允许在结构体定义的最后一个元素声明一个未知大小的数组,使得结构体能够处理可变长度的数据。

柔性数组的定义通常如下所示:

struct st_type {

int i;

int a[]; // 柔性数组成员

};

  在这个结构体中,a是一个柔性数组,它没有预定义的大小,这意味着数组a的大小可以在运行时确定。某些编译器支持int a[0]的写法,而有些则支持int a[]的写法,具体取决于编译器的实现。

2. 柔性数组的特点

柔性数组的使用具有以下几个特点:

  1. 结构体中柔性数组成员前必须至少有一个其他成员。

  2. 使用sizeof运算符计算包含柔性数组的结构体大小时,不包括柔性数组的内存。

  3. 为包含柔性数组的结构体动态分配内存时,分配的内存应该大于结构体的固定部分大小,以适应柔性数组的预期大小。

  • 动态内存分配和内存释放
    使用柔性数组时,通常需要通过malloc函数进行内存的动态分配。例如,如果需要在柔性数组a中存储10个int类型的元素,可以这样分配内存:

struct st_type *ps = (struct st_type*)malloc(sizeof(struct st_type) + 10 * sizeof(int));

这里,为结构体的固定部分分配了内存,并为柔性数组a预留了足够的空间。如果后续需要更多的空间,可以使用realloc函数来调整已分配内存的大小。

柔性数组的优点

 柔性数组相比于使用指针的传统方式,有几个明显的优点:

内存管理简化:使用柔性数组可以在一次malloc调用中同时为结构体和附加的数组分配内存,这简化了内存管理过程,减少了内存泄漏的风险。

减少内存碎片:柔性数组有助于减少内存碎片,因为它允许连续的内存分配,这提高了内存的使用效率。

提高访问速度:连续的内存分配有助于提高数据访问速度。

实际应用

柔性数组在实际应用中非常有用,特别是在需要处理不定长数据的场景,如网络通信、文件处理等。它们使得结构体能够更加灵活地适应不同的数据长度,同时保持了代码的简洁性和高效性。

在使用柔性数组时,开发者需要注意正确地分配和释放内存,以避免内存泄漏或其他内存相关的错误。正确使用柔性数组可以显著提高程序的性能和可维护性。