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;}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
c语言字符与字符串函数
C/C++计算'\0'之前的字符个数 返回类型为sizet(无符号整型) 字符串必须以'\0'结束
2
内存管理
C/C++栈(Stack) 存储非静态局部变量、函数参数、返回值 向下增长(从高地址向低地址) 自动分配和释放 堆(Heap) 动态内存分配区域 向上增长(从低地址向高地址) 手动管理(malloc/free, new/delete) 数据段/静态…
3
C++基础语法
C/C++std是C++标准库的命名空间,就像一个大文件夹 cout、endl等都放在这个"文件夹"里 using namespace std相当于说"我要用std文件夹里的所有东西" 不加这行的话,每次都要写std::cout,就像写"文件夹/文…
4
动态内存分配
C/C++现有内存开辟方式局限性 缺点:
5
数据在内存中存储
C/C++原码:直接将数值按照正负数形式翻译成二进制 反码:原码符号位不变,其他位按位取反 补码:反码 + 1
随机文章随机推荐

