您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-22 15:54 591 查看
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的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息