C语言中的泛型编程(void *)
2017-07-22 15:54
591 查看
C语言中的泛型编程(void *)
简介:之前有写过关于C++的泛型编程,使用template来实现的,也包括了一些函数模板,类模板的一些概念,那么在纯C的实现中,能不能也有这样的泛型?答案当然是可以的,这个时候就有必要使用所谓的万能指针,因为万能指针可以转换成其他的数据类型指针对象,这个时候就可以实现类型转换啦。
提示:
博主:章飞_906285288
博客地址:http://blog.csdn.net/qq_29924041
不多说,直接上代码:
注意的地方:
期初因为malloc的时候没有去使用10 * sizeof(int),而是直接就是10,所以抛出来了上述的错误,但是我打印出来的两个地址也是正确的,所以所以后来搜了下,原来申请的时候需要传入的参数需要是sizeof()得到的类型,而free的时候,也是根据这样的类型长度来free的。
简介:之前有写过关于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的。
相关文章推荐
- C语言泛型编程--抽象数据类型
- 单链表的逆置 --C语言泛型编程
- Linux内核学习之list_entry --- 用C语言实现泛型编程
- C语言实现泛型编程
- 备忘:C语言void *
- C语言的泛型编程
- 堆排序算法及其c语言泛型编程
- 如何在C语言中实现简单的泛型编程
- 如何在C语言中实现简单的泛型编程(二)
- 如何在C语言中实现简单的泛型编程(二)
- C语言实现泛型编程
- 如何在C语言中实现简单的泛型编程(二)
- 顺序表的实现--C语言泛型编程
- 如何在C语言中实现简单的泛型编程(一)
- 如何在C语言中实现简单的泛型编程(一)
- 如何在C语言中实现简单的泛型编程(一)
- C语言实现泛型编程
- C语言下的容器及泛型编程
- C语言实现泛型编程
- 堆排序算法及其c语言泛型编程