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<0
printf("%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字节,所以最后会有一个整数只填充了前三个字节,剩余一个字节保持原值。