设想
需求:
实现一个可以存放任意类型的安全数组,自带数组长度信息。
分析:
- 要实现对长度的高宽容性且进行必要初始化,使用动态内存 calloc 。
- 对任意类型都可以,使用void *类型作为array部分的类型。
- 自带长度信息,需要一个size_t 类型。
- array 与 长度信息强绑定,需要一个结构进行包装。
- void * 类型需要强制类型转换才能使用,需要固定类型的指针(type * name_arr)接收。
- 要简化过程,暴露接口必要参数,对过程隐藏,使用宏定义。
- 保证操作的有效性,生命周期考虑,宏定义内容不能用大括号包装。
- 内存清理原则:释放动态内存,遵循由浅到深,先free,后置NULL;普通指针直接置NULL值;
实现
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct {
void *void_arr;
size_t len;
}Array;
#define Create_Array( name, type, length ) \
Array *name = calloc(1,sizeof(Array)); \
type *name##_arr = NULL; \
if(name){ \
name->void_arr = calloc(length, sizeof(type)); \
if(name->void_arr){ \
name->len = length; \
name##_arr = (type*)name->void_arr; \
} \
else { \
free(name); \
name=NULL; \
} \
} \
printf("%p\n%p\n%p\n\n",name,name->void_arr,name##_arr); \
#define Destory_Array(name) \
free(name->void_arr);name->void_arr=name##_arr=NULL; \
free(name);name=NULL; \
int main(){
Create_Array( an, int, 10);
for(int i=0; i < an->len; i++){
an_arr[i]=i;
if(i < an->len-1) printf("%d->",an_arr[i]);
else printf("%d\n",an_arr[i]);
}
Destory_Array(an);
printf("%p %p\n",an, an_arr);
}
结果:
macro_power.png注意
文章为本人在简书平台原创,盗用必究!
网友评论