Learning c language(1): dynamic memory management
一 相关函数
void* malloc(size_t byte): 开辟动态空间
e.g:int* a = (int*)malloc(40)void* calloc(size_t, size_t num )void* realloc(void* ptr, size_t byte ):重新分配
注意:如果空间开辟失败,则会返回NULL
二 规范流程
- realloc应用临时指针接收返回值 防止开辟失败导致NULL覆盖原指针;
- 要记得free释放空间并指针置空 避免内存泄漏和野指针;
三 柔性数组
1. 定义
柔性数组,也称为伸缩性数组成员,是C99标准中引入的一种结构体特性。它允许在结构体定义的最后一个元素声明一个未知大小的数组,使得结构体能够处理可变长度的数据。
柔性数组的定义通常如下所示:
struct st_type {
int i;
int a[]; // 柔性数组成员
};
在这个结构体中,a是一个柔性数组,它没有预定义的大小,这意味着数组a的大小可以在运行时确定。某些编译器支持int a[0]的写法,而有些则支持int a[]的写法,具体取决于编译器的实现。
2. 柔性数组的特点
柔性数组的使用具有以下几个特点:
结构体中柔性数组成员前必须至少有一个其他成员。
使用sizeof运算符计算包含柔性数组的结构体大小时,不包括柔性数组的内存。
为包含柔性数组的结构体动态分配内存时,分配的内存应该大于结构体的固定部分大小,以适应柔性数组的预期大小。
- 动态内存分配和内存释放
使用柔性数组时,通常需要通过malloc函数进行内存的动态分配。例如,如果需要在柔性数组a中存储10个int类型的元素,可以这样分配内存:
struct st_type *ps = (struct st_type*)malloc(sizeof(struct st_type) + 10 * sizeof(int));
这里,为结构体的固定部分分配了内存,并为柔性数组a预留了足够的空间。如果后续需要更多的空间,可以使用realloc函数来调整已分配内存的大小。
柔性数组的优点
柔性数组相比于使用指针的传统方式,有几个明显的优点:
内存管理简化:使用柔性数组可以在一次malloc调用中同时为结构体和附加的数组分配内存,这简化了内存管理过程,减少了内存泄漏的风险。
减少内存碎片:柔性数组有助于减少内存碎片,因为它允许连续的内存分配,这提高了内存的使用效率。
提高访问速度:连续的内存分配有助于提高数据访问速度。
实际应用
柔性数组在实际应用中非常有用,特别是在需要处理不定长数据的场景,如网络通信、文件处理等。它们使得结构体能够更加灵活地适应不同的数据长度,同时保持了代码的简洁性和高效性。
在使用柔性数组时,开发者需要注意正确地分配和释放内存,以避免内存泄漏或其他内存相关的错误。正确使用柔性数组可以显著提高程序的性能和可维护性。