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

来源:互联网 发布:java函数重载是指 编辑:程序博客网 时间:2024/06/05 23:59

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的。