本文主要是介绍关于void指针用法的一些疑虑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
三天,学长给的三个小函数现在只写出了一个。
实现三个函数
int memoryset(void * dst, const void * src, size_t n);
将dst 所指向的内存中的每个字节的内容全部设置为src 指定的值,先以八个字节为单位,
不足再以四字节位单位,不足再以两字节为单位,余下的以一字节为单位。
int memorycpy(void * dst, const void * src, size_t n);
将src 所指向的内存复制到dst 指定的区域,先以八个字节为单位,不足再以四字节位单位,
不足再以两字节为单位,余下的以一字节为单位。
int memorymov(void * dst, const void * src, size_t n);
将src 所指向的内存复制到dst 指定的区域(当dst 小于src 且有重叠时也能正常复制),先
以八个字节为单位,不足再以四字节位单位,不足再以两字节为单位,余下的以一字节为单
位。
这三个都是库函数好像,只写出了第二个,有些感慨,还有些疑虑。
我的这些真有点太初级了:
#include<stdio.h>
#include<stdlib.h>
int memorycpy(void *dst,const void *src,size_t n)
{
size_t n8,n4,n2,n1;
void *flag_d[3];/*数组用来存取移动后的指针位置*/
const void*flag_s[3];
flag_d[2]=dst;
flag_s[2]=src;
if(n>=sizeof(double)){
n8=n/sizeof(double); /*8字节段的个数*/
double*p8=(double*)dst;
double*q8=(double*)src;
for(;n8>0;n8--)
*p8++=*q8++;
n=n-(n8+1)*sizeof(double);
flag_d[2]=p8;
flag_s[2]=q8;
}
/*4、2、1字节段至多只有一个*/
flag_d[1]=flag_d[2];
flag_s[1]=flag_s[2];
if(n>=sizeof(float)){
n4=n/sizeof(float);
if(n4){
float*p4=(float*)flag_d[2];
float*q4=(float*)flag_s[2];
*p4++=*q4++;
n=n-n4*sizeof(float);
flag_d[1]=p4;
flag_s[1]=q4;
}
}
flag_d[0]=flag_d[1];
flag_s[0]=flag_s[1];
if(n>=sizeof(short)){
n2=n/sizeof(short);
if(n2){
short*p2=(short*)flag_d[1];
short*q2=(short*)flag_s[1];
*p2++=*q2++;
n=n-n2*sizeof(short);
flag_d[0]=p2;
flag_s[0]=q2;
}
}
if(n){
n1=n/sizeof(char);
if(n1){
char*p1=(char*)flag_d[0];
char*q1=(char*)flag_s[0];
*p1=*q1;
}
}
return 0;
}
一段测试:
int main()
{
char src[]="1234567890abcdefg";
/*char dst[]={"/0"};*/
char*dst=(char*)malloc(11);
memorycpy(dst,src,sizeof(src));
printf("%s/n",dst);
return 0;
}
1.不明白为什么这里不论dst传入的是多长的指针,都能正确复制?
2.第一个问题中,要把dst指向的地址“全部设置为src指向的值“,如果dst比src长的话怎么判断dst结束没有?
3.第三个问题中怎么知道dst比src是大还是小,如果dst比src小,又该怎么实现呢?
这篇关于关于void指针用法的一些疑虑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!