【内存操作函数使用】(上)

简介: 【内存操作函数使用】

1. memcpy函数


描述

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1


声明

下面是 memcpy() 函数的声明。

void *memcpy(void *str1, const void *str2, size_t n)


参数

str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。

n -- 要被复制的字节数。


返回值

该函数返回一个指向目标存储区 str1 的指针


实例:

#include <stdio.h>#include <string.h>//内存函数使用//memcpy(内存拷贝函数)intmain() {
intarr1[10] = { 1,2,3,4,5,6 };
intarr2[10] = { 0 };
memcpy(arr2, arr1, 12);
for (inti=0; i<3; i++) {
printf("%d ", arr2[i]);
    }
return0;
}

运行结果:

b8bb382cd5bd4f278d87ce2d1373058a.png

我们可以看到,memcpy实际上是一个拷贝函数,但是它与strcpy函数有所不同,一是参数不同,二是memcpy可以拷贝任意类型的数据,因为它的接收类型是void。

模拟实现memcpy:

#include <stdio.h>#include <assert.h>void*my_memcpy(void*dest, constvoid*src, intnum) {
assert(dest);
assert(src);
void*ret=dest;
while (num--) {
*(char*)dest=*(char*)src;
dest= (char*)dest+1;
src= (char*)src+1;
    }
returnret;
}
intmain() {
intarr1[10] = { 1,2,3,4,5,6,7,8,9 };
intarr2[10] = { 0 };
my_memcpy(arr2, arr1, 20);
inti=0;
for (i=0; i<5; i++) {
printf("%d ", arr2[i]);
    }
return0;
}


2.memmove函数


描述

C 库函数 void *memmove(void *str1, const void *str2, size_t n)str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。


声明

下面是 memmove() 函数的声明。

void *memmove(void *str1, const void *str2, size_t n)


参数

str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。

n -- 要被复制的字节数。


返回值

该函数返回一个指向目标存储区 str1 的指针。


实例:

#include <stdio.h>#include <string.h>intmain() {
intarr1[10] = { 1,2,3,4,5,6,7,8 };
memmove(arr1+3,arr1, 12);
inti=0;
for (i=0; i<8; i++) {
printf("%d ", arr1[i]);
    }
return0;
}

运行结果:

3f7f9fd609f049ff8902d1850100399d.png

模拟实现memmove:

#include <stdio.h>#include <string.h>#include <assert.h>void*my_memmove(void*dest, constvoid*src, intnum) {
assert(dest);
assert(src);
void*ret=dest;
if (dest<src) {
while (num--) {
*(char*)dest=*(char*)src;
dest= (char*)dest+1;
src= (char*)src+1;
        }
    }
else {
while (num--) {
*((char*)dest+num) =*((char*)src+num);
        }
    }
returnret;
}
intmain() {
intarr1[10] = { 1,2,3,4,5,6,7,8 };
my_memmove(arr1+3, arr1, 12);
inti=0;
for (i=0; i<8; i++) {
printf("%d ", arr1[i]);
    }
return0;
}

目录
相关文章
|
24天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
15天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
29天前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
113 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
11天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
13 0
|
5月前
|
C语言
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
62 0
|
24天前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
38 0
|
26天前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
60 0
|
26天前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
57 0