内存操作

来源:互联网 发布:网络传播营销策划案 编辑:程序博客网 时间:2024/05/21 22:02

根据定义,字符串由一个NUL(‘\0’)字节结尾,所以字符串内部不能包含任何NUL字符,但是,内部包含NUL的字符串是可能存在的,此时我们不能使用字符串处理函数来

处理这种类型的数据。

我们可以使用另外一组相关的函数它们的操作与字符串函数类似,但是这些函数能够处理任何字节序列。he strn开头的函数不同,这些函数遇到NUL不会停止操作。


1.memcpy

void *memcpy(void *dst,const void *src,size_t length)

从src的起始位置复制length个字节到dst的内存起始位置。可以使用该函数复制任何类型的值,第三个参数指定复制值的长度(以字节为单位)。如果src和dst出现了内存重叠,结果是未定义的。
char temp[SIZE],value[SIZE];memcpy(temp,value,SIZE)

如果是其他类型(大于一个字节),例如int
int temp[SIZE],value[SIZE];memcpy(temp,value,sizeof(value))

或者:
memcpy(temp,value,SIZE*sizeof(int))

2.memmove

void *memmove(void *dst,const void *src,size_t length)

该函数和memcpy基本一样,只是它允许src和dst存在内存重叠。

3.memcmp

void *memcmp(const void *a,const void *b,size_t length)

比较两部分内存,共比较length个字节,这些值按照无符号字符逐个比较,返回负数表示a<b ,返回正数表示a>b ,返回0表示a==b。
由于这些值是按照无符号字节进行比较的,所以如果用于比较的不是单字节数据如整数或浮点数就可能出现不可预料的结果。

4.memchr

void *memchr(const void *a,int ch,size_t length)

从a的起始位置开始查找字符ch第一次出现的位置,并返回一个指向该位置的指针,它共查找length个字节。如果未找到,则返回空指针。

5.memset

void *memset(void *a,int ch,size_t length)
将a开始的length个字节都设置为字符值ch。
这个函数很容易出错,特别要注意,它是以字节为单位来设置为ch值的。
例如,将一个数组置0:
int x[10];memset(x, 0, sizeof(x));

于是,很多人就觉得,那么把数组元素全部设置为1,则:
int x[10];memset(x, 1, sizeof(x));

结果是什么呢?
我们看看:


咦,奇怪,怎么不是1呢?这个16843009又是怎么回事。
这里,让我再说一次,memset(其他的mem开头函数也一样)操作内存是以字节为单位的!!!!

由于每个int占4个字节,当调用memset(x, 1, sizeof(x))时,int的4个字节被逐个设置为1:


它的十进制正好就是16843009

mem开头的函数操作内存是以字节为单位的!!!!!!!!!