关于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

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s

Springboot中Jackson用法详解

《Springboot中Jackson用法详解》Springboot自带默认json解析Jackson,可以在不引入其他json解析包情况下,解析json字段,下面我们就来聊聊Springboot中J... 目录前言Jackson用法将对象解析为json字符串将json解析为对象将json文件转换为json

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语言非