一、memcpy
—— 内存拷贝
void * memcpy ( void * destination, const void * source, size_t num );
memcpy
函数用于将源内存区域的内容复制到目标内存区域。功能是将从source
指向的内存起始位置连续num
个字节的数据,原样复制到destination
指向的内存区域。
例如:
void* My_memcpy(void * dest, const void * src,size_t sz) {// ...
}int main() {int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };My_memcpy(arr1+2,arr1,sizeof(arr1)); // 将arr1的前20个字节复制到arr1+2开始的位置// 复制后arr1内存情况:// | 1 | 2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |// 打印数组内容for (int i = 0; i < 10; i++) {printf("%d ", arr1[i]);}return 0;
}
在上述自定义实现的My_memcpy
函数中,根据目标和源地址的大小关系,分别采用了不同的复制策略,以防止在复制过程中对已复制的部分造成覆盖。
二、memcmp
—— 内存比较
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
memcmp
函数用于比较两个内存区域的前num
个字节内容。功能是对ptr1
和ptr2
所指内存的前num
个字节进行逐个比较,返回值为负数、零或正数,表示ptr1
区域小于、等于或大于ptr2
区域。
例如:
int main() {int arr1[] = { 1,2,3,4,5,6,7,8 };int arr2[] = { 1,2,3,4,6,6,7,8 };int a = memcmp(arr1, arr2,20); // 比较arr1和arr2前20个字节(实际元素个数不足20)// 前四个字节相同,第五个字节arr1[4]=5,arr2[4]=6,因此a<0printf("%d ", a); // 输出负数return 0;
}
此处注意,虽然数组的实际元素个数不足20,但memcmp
会继续比较数组之后的内存(可能未初始化),这可能导致不可预期的结果。
三、memset
—— 内存设置
void * memset ( void * ptr, int value, size_t num );
memset
函数用于将指定内存区域填充为特定的字符。功能是从ptr
指向的内存地址开始,将接下来num
个字节全部填充为整型变量value
对应的ASCII字符(对于非字符类型,填充的是该类型的value
)。
例如:
int main() {int arr[10] = { 0 };memset(arr,1,12); // 将arr数组的前12个字节(即前三个整数)填充为1(假设int为4字节)// 填充后arr内存情况(假设int为4字节):// | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |return 0;
}
这里需要注意,如果num
不是目标类型长度的整数倍,那么最后一个对象可能会部分填充。例如上例中,由于num=12
且int
为4字节,所以最后会有一个整数只填充了前三个字节,剩余一个字节保持原值。