memcpy与memset函数的使用方法

这个主要用于我个人的学习笔记,便于以后查询,顺便分享给大家。

想必在用C的时候难免会与数组,指针,内存这几样东西打交道,先以数组为例,例如有一个数组int a[5] = {1, 2, 3, 4, 5},我们要将数组a里面的数据复制到数组b中,一般刚刚接触C语言的我们会怎么做?我们一般会想到用循环来做吧

int i;
int a[5] = {1, 2, 3, 4, 5}, b[5];

for(i = 0; i < 5; i++)
{
    b[i] = a[i];
}

但是,如果有多个数组要复制,或者强迫症看不惯自己写的这么臃肿的代码,不想这样写,我们该怎么办?这时就要用到接下来要介绍的函数memcpy了。

memcpy

原型:

void *memcpy(void *dest, const void *src, size_t n);

需要的头文件:

#include<string.h>

用法:

memcpy函数是内存拷贝函数,功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

因为这个函数是直接操作内存的,所以我们一开始那个例子的执行效率会大大提高。不懂怎么用?我们来看一下代码就行。

1 #include<string.h>
 2 
 3 int main(void)
 4 {
 5     int a[5] = {1, 2, 3, 4, 5}, b[5];
 6     /*第一个参数是要保存的位置的起始地址,所以我们直接放b
 7      *第二个参数是源数据的起始地址,所以我们把a放上去
 8      *第三个参数是要复制的内存块的长度,为a的长度sizeof(a)*/
10     memcpy(b, a, sizeof(a));
11 }

就这样一行的代码,就能代替我们之前的for循环,是不是简洁高效了许多。这个函数的作用不仅仅是这样,它还可以用与两个字符串的复制,内存块的复制等,各种数据类型都能复制,是不是一个很棒的函数呢*_*它的更多功能还待各自己去探索,有好用的技巧也请务必告诉我,我必将感谢。

那么,接下来,我们又有新的问题了,我们已经把a的数据传给b了,所以想把a清零,我们要怎么做呢?

一、我们可以像以前那样用循环来做,但是强迫症不接受啊。

二、我们可以用刚刚学到的memcpy函数,再弄一个初始化的数组c = {0, 0, 0, 0, 0},然后把c复制给a,但是这样做就有点弄巧成拙了,还不如用方法一。

三、可以用我们接下了要介绍的memset函数,一句话搞定,新姿势get 😃

memset

原型:

void *memset(void *s, int ch, size_t n);

用法:

memset是计算机中C/C++语言函数。将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ascii值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。

函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

以我们一开始提出的问题为例:

#include<string.h>

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};
    memset(a, 0, sizeof(a));
}

就这样就成功清零了,是不是很方便。

注意:

如果是字符数组的话,memset可以随便用,但是如果是其他类型的数组,一般只用来清零,如果是填充数据就不合适了,如:

memset(a, 1, sizeof(a));

想用这个来把a所有元素设置为1,是不成功的,为什么呢?因为memset函数每次填充的数据长度为一个字节,即为0x01,而a的一个元素长度为4个字节,即0x00000000,如果把0x01填充进去,则填充的结果是0x01010101,而不是我们期待的0x00000001,所以是不合适的,但是用来清零真是一级棒!

这次的笔记就到这里了,希望能帮到大家。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
memset函数memcpy函数是C/C++标准库中的两个函数,用于对内存进行操作。 1. memset函数: - 函数原型:`void* memset(void* dest, int value, size_t n);` - 功能:将一块内存设置为指定的值。 - 参数: - `dest`:要设置的内存块的起始地址。 - `value`:要设置的值,通常是一个无符号字符。 - `n`:要设置的字节数。 - 返回值:指向目标内存块的指针。 - 示例: ```cpp unsigned char AIdataGram[111]; memset(AIdataGram, 0, 111 * sizeof(unsigned char)); ``` - 上述示例使用memset函数将AIdataGram数组中的所有元素设置为0,以实现数组的初始化。 2. memcpy函数: - 函数原型:`void* memcpy(void* dest, const void* src, size_t n);` - 功能:将源内存块的内容复制到目标内存块。 - 参数: - `dest`:目标内存块的起始地址,即数据将被拷贝到的位置。 - `src`:源内存块的起始地址,即数据将被拷贝的位置。 - `n`:要拷贝的字节数。 - 返回值:指向目标内存块的指针。 - 示例: ```cpp char src[] = "Hello"; char dest[10]; memcpy(dest, src, strlen(src) + 1); ``` - 上述示例使用memcpy函数将源数组src中的内容复制到目标数组dest中。注意要确保目标数组有足够的空间来存储源数组的内容。 总结:memset函数用于设置内存块的值,而memcpy函数用于复制内存块的内容。它们都是在处理内存操作时常用的函数,能够提供高效的内存操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值