美文网首页C语言
利用宏实现C语言任意类型的安全数组

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

作者: 黑熊小李 | 来源:发表于2022-10-30 18:39 被阅读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

    注意

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

    相关文章

      网友评论

        本文标题:利用宏实现C语言任意类型的安全数组

        本文链接:https://www.haomeiwen.com/subject/afsltdtx.html