C语言

利用宏实现C语言任意类型的安全数组

2022-10-30  本文已影响0人  黑熊小李

设想

需求:

实现一个可以存放任意类型的安全数组,自带数组长度信息。

分析:

  1. 要实现对长度的高宽容性且进行必要初始化,使用动态内存 calloc 。
  2. 对任意类型都可以,使用void *类型作为array部分的类型。
  3. 自带长度信息,需要一个size_t 类型。
  4. array 与 长度信息强绑定,需要一个结构进行包装。
  5. void * 类型需要强制类型转换才能使用,需要固定类型的指针(type * name_arr)接收。
  6. 要简化过程,暴露接口必要参数,对过程隐藏,使用宏定义。
  7. 保证操作的有效性,生命周期考虑,宏定义内容不能用大括号包装。
  8. 内存清理原则:释放动态内存,遵循由浅到深,先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

注意

文章为本人在简书平台原创,盗用必究!

上一篇 下一篇

猜你喜欢

热点阅读