美文网首页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语言任意类型的安全数组

    前述 在我的上一篇文章《利用宏实现C语言任意类型的安全数组》[https://www.jianshu.com/p/...

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

    设想 需求: 实现一个可以存放任意类型的安全数组,自带数组长度信息。 分析: 要实现对长度的高宽容性且进行必要初始...

  • C语言17 数组参数传递

    C语言17 数组参数传递 基本类型参数传递 数组作为参数 编写一个函数,能够打印任意整形数组的值 总结: 数组作为...

  • c++类型转换及RTTI

    我们都知道C++完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,...

  • C语言结构体实现线性数组

    ·利用C语言的结构体及指针的相关知识,仿照数组类自己实现一个数组。并实现类似数组的一些接口方法。这边考虑利用结构体...

  • 指针是C语言中重要数据类型,利用指针可以有效的表示复杂的数据结构,实现动态分配内存,更方便、更灵活的使用数组、...

  • 如何为元组中每个元素命名,提高程序可读性

    普通做法: C语言实现: c: 采用宏定义枚举类型 python解决方案 使用标准库中collections.na...

  • C语言自定义布尔bool类型

    C语言没有布尔类型,可以采用宏定义创建该类型

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 一个用宏实现的List

    一 C中宏的应用 如果我们写个排序方法, 用c语言实现的话,由于没有通用的类型,也没有c++的模板,没有java的...

网友评论

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

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