C++中memset函数和memcpy函数

该文章已生成可运行项目,

memset函数:

memset 是 C++ 标准库中的一个函数,它用于将一块内存初始化为指定的值。

1.头文件:

#include <cstring>

2.基本用法:

函数模板:

void* memset(void* ptr, int value, size_t num);

//ptr
//指向要设置值的内存块的指针。memset会在不改变指针本身的情况下,修改指针指向的内存区域

//value 
//用于初始化内存块的值。
//这个值会被解释为一个字节(通常是 char),然后这个字节会被复制到内存块的每个字节位置。
//由于memset是按字节操作的,所以通常只能用0或-1以及它们的等价形式(例如 0xFF)作为value参数,因为其他值可能不会在所有位上产生期望的结果。

//num
//指定要设置的内存字节数。这个值决定了ptr指向的内存块中有多少字节会被设置为value

memset(数组首地址,初始值,初始化大小)

3.常见误区:

由于 memset 是按字节操作的,所以用于初始化非字节大小的数据类型如int float double类型的需要慎重考虑

4.示例代码:

char数组初始化:

#include<iostream>
#include<cstring>
using namespace std;

int main(){
	char arr[10]; 
	
	memset(arr, 'a', 10);//从arr[0]开始,初始化10个字节的值为'a';
	for(int i = 0;i < 10; ++i)
		cout << arr[i] << ' ';      //初始化后数组:a a a a a a a a a a
}
#include<iostream>
#include<cstring>
using namespace std;

int main(){
	char arr[10]; 
	
	memset(arr, 'a', 10);       //a a a a a a a a a a
	
	memset(arr + 5, 'b', 4);    //从数组首地址 + 5即arr[5]开始,初始化4个字节的值为'b';
	for(int i = 0; i < 10; ++i)
		cout << arr[i] << ' ';      //初始化后数组 a a a a a b b b b a
}

利用sizeof计算字节数大小辅助运算

#include<iostream>
#include<cstring>
using namespace std;

int main(){
	char arr[10]; 
	
	memset(arr, 'a', 10);       //a a a a a a a a a a
	cout << sizeof(arr) << endl;    //10
	memset(arr, 'c' ,sizeof(arr));   //从数组首地址开始,初始化数组大小个字节的值为'c'
	for(int i = 0; i < 10; ++i)
		cout << arr[i] << ' ';      //c c c c c c c c c
}

对于其他数组的初始化用法:

针对于实际需求,需要将数组初始化为 0 的时候就用 0,需要初始化为最大值的时候用0x3f

#include <iostream>
#include <cstring>
using namespace std;

int main() {
  int intArray[5];

  memset(intArray, 0, sizeof(intArray));
  for (int i = 0; i < 5; i++) 
    cout << intArray[i] << " "; // 0 0 0 0 0
  
  cout << endl;
  
  memset(intArray, 0x3f, sizeof(intArray));
  for (int i = 0; i < 5; i++) 
    cout << intArray[i] << " "; //1061109567 1061109567 1061109567 1061109567 1061109567 
  return 0;
}

memcpy函数:

1.头文件:

#include <cstring>

2.基本用法:

memcpy 是 C++ 标准库中用于内存操作的函数之一,它定义在 <cstring> 头文件中。memcpy 函数的主要功能是在内存中复制一定数量的字节从源地址(source)到目标地址(destination)。

void* memcpy(void* destination, const void* source, size_t num);
  • destination目标地址): 指向要复制内容的目标内存块的指针。复制操作不会改变这个指针的值。

  • source源地址): 指向要复制内容的源内存块的指针。这个指针指向的数据将被复制到目标内存块。

  • num(字节数): 指定要复制的字节数。这个值表示从源地址到目标地址复制的字节数量。

  • 3.示例代码

  • #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main() {
        char source[] = "Hello, world!";
        char destination[15];
        cout << strlen(source) << endl;         // 13
        memcpy(destination, source, strlen(source) + 1); //strlen函数用于计算source数组字符串长度
    
        cout << destination << endl;    //Hello, world!
        return 0;
    }
    
    

    memcpy 函数会将源内存区域中的 n 个字节的数据复制到目标内存区域,可能包含原先的内容。函数不会检查边界,因此保证源和目标内存区域的大小至少为 n 非常重要。

学习时整理,不当之处烦请指正
码字不易,留个赞再走吧

记于2024.10.10

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值