c语言内存函数

719 字
4 分钟
c语言内存函数

memcpy - 内存拷贝#

void *memcpy(void *destination, const void *source, size_t num);
  • 从source位置开始向后复制num个字节到destination指向的内存位置
  • 不会在遇到’\0’时停下来
  • 如果source和destination有重叠,复制结果是未定义的
  • 适用于非重叠内存区域的拷贝

使用示例#

#include <stdio.h>
#include <string.h>
int main() {
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = {0};
memcpy(arr2, arr1, 20); // 拷贝20个字节(5个int)
for(int i = 0; i < 10; i++) {
printf("%d ", arr2[i]);
}
// 输出: 1 2 3 4 5 0 0 0 0 0
return 0;
}

模拟实现#

void *memcpy(void *dst, const void *src, size_t count) {
void *ret = dst;
assert(dst);
assert(src);
/* copy from lower addresses to higher addresses */
while(count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return ret;
}

memmove - 可处理重叠的内存拷贝#

void *memmove(void *destination, const void *source, size_t num);
  • 与memcpy功能类似,但可以处理源内存块和目标内存块重叠的情况
  • 如果源空间和目标空间出现重叠,必须使用memmove函数

使用示例#

#include <stdio.h>
#include <string.h>
int main() {
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
memmove(arr1 + 2, arr1, 20); // 将前5个元素拷贝到从第3个元素开始的位置
for(int i = 0; i < 10; i++) {
printf("%d ", arr1[i]);
}
// 输出: 1 2 1 2 3 4 5 8 9 10
return 0;
}

模拟实现#

void *memmove(void *dst, const void *src, size_t count) {
void *ret = dst;
if(dst <= src || (char *)dst >= ((char *)src + count)) {
/* Non-Overlapping Buffers - 从低地址向高地址拷贝 */
while(count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
} else {
/* Overlapping Buffers - 从高地址向低地址拷贝 */
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while(count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return ret;
}

memset - 内存设置#

void *memset(void *ptr, int value, size_t num);
  • 将内存中的值以字节为单位设置成指定内容
  • 常用于初始化内存区域或清空数组

使用示例#

#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello world";
memset(str, 'x', 6); // 将前6个字节设置为'x'
printf("%s\n", str); // 输出: xxxxxxworld
// 也可以用于初始化数组
int arr[10];
memset(arr, 0, sizeof(arr)); // 将整个数组初始化为0
return 0;
}

memcmp - 内存比较#

int memcmp(const void *ptr1, const void *ptr2, size_t num);
  • 比较从ptr1和ptr2指针开始向后的num个字节
  • 按无符号字符的方式逐字节比较
返回值含义
<0第一个不匹配的字节在prt1中的值小于prt2中的值
=0两个内存块的内容相等
>0第一个不匹配的字节在prt1中的值大于prt2中的值

使用示例#

#include <stdio.h>
#include <string.h>
int main() {
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if(n > 0)
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
else if(n < 0)
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
else
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
return 0;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Profile Image of the Author
HandlerOne
おかえり
公告
本站已整理 138 篇技术笔记,并按 8 条主线排成学习路线(141 站);站内搜索与桌宠对话均已上线。
分类
标签
最新动态
站点统计
文章
138
分类
12
标签
42
总字数
597,044
站点信息
构建平台
腾讯云 · Nginx
博客版本
v6.16.8
文章目录