C语言中的泛型编程(void *)

C语言中的泛型编程(void *)


简介:之前有写过关于C++的泛型编程,使用template来实现的,也包括了一些函数模板,类模板的一些概念,那么在纯C的实现中,能不能也有这样的泛型?答案当然是可以的,这个时候就有必要使用所谓的万能指针,因为万能指针可以转换成其他的数据类型指针对象,这个时候就可以实现类型转换啦。


提示:

博主:章飞_906285288
博客地址:http://blog.csdn.net/qq_29924041


不多说,直接上代码:

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<assert.h>

/*使用void*指针来定义这样的交换函数,但是需要注意的是,在交换的时候,因为交换的是里面的数据,所以尽可能使用memcpy来对内存进行操作*/
void *t;
void swap(void* t1,void* t2,int size){
    t = (void*)malloc(size);
    assert(t != NULL);
    memcpy(t,t1,size);  
    memcpy(t1,t2,size);
    memcpy(t2,t,size);

}

extern void swap2(int *num_pointer1,int *num_pointer2){
    int temp;
    temp = *num_pointer1;
    *num_pointer1 = *num_pointer2;
    *num_pointer2 = temp;
}



void out_array(const int* array,int num){
    int i = 0;
    for(i = 0 ; i < num ; i++){
        printf("array[%d]:%d\n",i,*(array + i));
    }
    printf("===============\n");
}

int main(int argc,char *argv[]){
    //注意一定要使用sizeof(XX) * num,否则在运行的时候,free的时候会抛出错误
    int *array = (int *)malloc(10 * sizeof(int));
    assert(array != NULL);

    printf("array,address%p\n",array);
    int i,j;
    printf("please input array\n");
    for(i = 0 ;i < 10 ; i++){
        *(array + i) = rand() % 100 +1;
        printf("%4d ",*(array+i));
    }
    printf("\n");

    out_array(array,10);

    for(i = 0; i < 9; i++){
        for(j = i + 1 ; j < 10 ;j++){
            if(*(array+i) < *(array+j)){
                swap(array+i,array+j,sizeof(int));
                swap2(array+i,array+j);
            }
        }
    }

    out_array(array,10);
    printf("array address:%p\n",array);
    free(t);
    free(array);

    return 0;
}

注意的地方:

*** Error in `./select': free(): invalid next size (fast): 0x00000000012c61d0 ***

期初因为malloc的时候没有去使用10 * sizeof(int),而是直接就是10,所以抛出来了上述的错误,但是我打印出来的两个地址也是正确的,所以所以后来搜了下,原来申请的时候需要传入的参数需要是sizeof()得到的类型,而free的时候,也是根据这样的类型长度来free的。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值