赞
踩
目录
以下都是内存函数,作用单位均是字节
memcpy是C/C++语言中的一个内存拷贝函数,其原型为:
- void* memcpy(void* dest, const void* src, size_t n);
- 目标空间(字节) 源空间(字节) 拷贝个数
该函数的功能是将源地址src开始的n个字节内容复制到目标地址dest开始的内存空间。
使用memcpy函数需要注意以下几点:
接下来,我们观察memcpy函数:
- #include <stdio.h>
- #include <string.h>
-
- int main() {
- const char* src = "Hello, memcpy!";
- char dest[20];
-
- // 复制字符串到dest中
- memcpy(dest, src, strlen(src) + 1);
-
- // 输出复制后的字符串
- printf("Copied string: %s\n", dest);
-
- return 0;
- }
程序运行结果:
Copied string: Hello, memcpy!
很显然,源字符串“Hello, memcpy!”已成功被复制到了目标字符数组dest
中。
现在,我们来观察memcpy函数的实现方式:
- //Memcpy
- #include<stdio.h>
- #include<assert.h>
-
- void* Memcpy(void* dest, const void* src, size_t byte_num) {
- assert(dest && src);
- char* ptr_1 = (char*)dest;
- const char* ptr_2 = (const char*)src;
- while (byte_num) {
- *ptr_1 = *ptr_2;
- ptr_1++;
- ptr_2++;
- byte_num--;
- }
- return dest;//返回指向目标内存块的指针。
- }
-
- int main() {
- int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
- int src[] = { 8,8,8,8,8,8,8,8,8,8 };
- Memcpy(arr, src, 15);
- for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
- printf("%d ", arr[i]);
- }
- return 0;
- }

memmove函数与memcpy函数功能相似,但是memmove函数会考虑源地址和目标地址重叠的情况,它会根据具体情况采取不同的拷贝方式,避免数据错误或内存访问冲突。
接下来,我们观察memmove函数:
- #include <stdio.h>
- #include <string.h>
-
- int main() {
- char str[50] = "Hello, memmove!";
- char buffer[20];
-
- // 复制数据到buffer,源和目标地址重叠
- memmove(str + 7, str, strlen(str) + 1);
-
- // 输出复制后的字符串
- printf("Copied string: %s\n", str);
-
- return 0;
- }
很容易发现,memmove函数可以作用于同一个函数
我们再看看该函数的模拟实现:
- void* my_memmove(void* dest, const void* src, size_t n) {
- char* d = (char*)dest;
- const char* s = (const char*)src;
-
- // 判断源地址和目标地址是否有重叠
- if (d < s) {
- for (size_t i = 0; i < n; i++) {
- d[i] = s[i];
- }
- } else if (d > s) {
- for (size_t i = n; i > 0; i--) {
- d[i - 1] = s[i - 1];
- }
- }
-
- return dest;
- }

my_memmove
函数和标准的memmove
函数功能类似,可以处理源地址和目标地址重叠的情况。如果源地址在目标地址之前,就从源地址前往后复制数据;如果源地址在目标地址之后,就从源地址后往前复制数据。
memset函数是C标准库中的一个函数,用于将一块内存空间的内容全部设置为指定的值。
接下来,我们观察memset函数:
- #include <stdio.h>
- #include <string.h>
-
- int main() {
- char str[50];
-
- // 初始化str数组为0
- memset(str, 0, sizeof(str));
-
- // 打印初始化后的字符串
- printf("Initialized string: %s\n", str);
-
- return 0;
- }
Initialized string:
在这个例子中,我们先定义了一个字符数组
str
,然后使用memset
函数将str
数组内的内存空间全部设置为0。最后打印出初始化后的字符串内容,因为全部设置为0,所以输出结果为"Initialized string: "。
memset
函数通常用于在初始化数据结构或清空内存块时设置初始值,例如清空一个数组、结构体或其他内存区域的内容。
我们再看看该函数的模拟实现:
- void* my_memset(void* ptr, int value, size_t num) {
- unsigned char* p = (unsigned char*)ptr;
- for (size_t i = 0; i < num; i++) {
- p[i] = (unsigned char)value;
- }
- return ptr;
- }
这个模拟实现的
my_memset
函数功能类似于标准的memset
函数,通过将内存空间中的每个字节设置为指定的值来实现初始化。传入的参数包括要初始化的内存位置的指针ptr
,要设置的值value
,以及要初始化的字节数num
。循环遍历内存空间,将每个字节设置为指定的值。最后返回指向初始化后的内存空间的指针。
memcmp
是C标准库中的一个函数,用于比较两块内存区域的内容。
接下来,我们观察memset函数:
- #include <stdio.h>
- #include <string.h>
-
- int main() {
- char str1[] = "Hello";
- char str2[] = "World";
-
- int result = memcmp(str1, str2, 5);
-
- if (result == 0) {
- printf("str1 and str2 are equal.\n");
- } else if (result < 0) {
- printf("str1 is less than str2.\n");
- } else {
- printf("str1 is greater than str2.\n");
- }
-
- return 0;
- }

str1 is less than str2.
这是因为在ASCII编码中,字符'H'的ASCII码小于字符'W'的ASCII码。因此,
str1
在内存中的前5个字符的比较结果是str1
小于str2
。
Over……希望对你有帮助,fight together!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。