关于void指针用法的一些疑虑

2024-01-29 06:48
文章标签 指针 用法 疑虑

本文主要是介绍关于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指针用法的一些疑虑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656077

相关文章

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

UVM:callback机制的意义和用法

1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函

这些ES6用法你都会吗?

一 关于取值 取值在程序中非常常见,比如从对象obj中取值 const obj = {a:1b:2c:3d:4} 吐槽: const a = obj.a;const b = obj.b;const c = obj.c;//或者const f = obj.a + obj.b;const g = obj.c + obj.d; 改进:用ES6解构赋值

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写