本文主要介绍C语言中的memset()函数,包括它和memcpy()函数的区别。有需要的朋友可以参考一下。
C memset()函数:将内存的前N个字节设置为特定值。
头文件:
#包含字符串. h
memset()函数用于将指定内存的前N个字节设置为特定值,其原型为:
void * memset( void * ptr,int value,size _ t num);
参数描述:
Ptr是指向要操作的内存的指针。
Value是要设置的值。可以将int类型或char类型的值传递给value。int和char可以根据ASCII码相互转换。
Num是ptr的第一个num字节,size_t是无符号整数。
【功能描述】memset()会将ptr指向的内存区域的第num个字节的值设置为value,然后将指针返回给ptr。
Memset()可以将所有内存空间设置为一个特定的值,所以它经常被用来初始化字符数组。例如:
char string[20];
memset(str,' \0 ',sizeof(str)-1);
[返回值]返回指向ptr的指针。
注意:虽然参数值声明为int,但它必须是无符号的char,所以范围在0到255之间。
示例:
复制一个新的纯文本窗口。
#包含stdio.h
#包含stdlib.h
#包含字符串. h
int main()
{
//不能声明为char * str=' http://c . biancheng . net ';
char str[]=' http://c . biancheng . net ';
memset(str,'-',7);
卖出(str);
系统(“暂停”);
返回EXIT _ SUCCESS
}
执行结果:
c.biancheng.net
memmove和memcpy的区别
cpy和memmove()都是C语言中的库函数。在头文件string.h中,作用是复制一定长度memcpy的内容。原型如下:
void *memcpy(void *dst,const void *src,size _ t count);
void *memmove(void *dst,const void *src,size _ t count);
它们的功能是一样的。唯一不同的是,当内存局部重叠时,memmove保证复制的结果是正确的,而memcpy不保证复制的结果是正确的。
第一种情况,复制重叠区域不会有问题,所有内容都可以正确复制。
在第二种情况下,问题出现在右边的两个字节中。这两个word部分的原始内容首先被覆盖,没有保存。所以下一次复制的时候,复制已经被覆盖的内容,这显然是有问题的。
实际上,memcpy只是memmove的一个子集。
两者的c语言实现非常简单,有兴趣的朋友可以去看看。实际上,这两个功能都是通过汇编实现的。
在复制两个有重叠区域的内存时,Memmove可以保证正确的副本,memcopy不行,但是memcopy比memmove快,比如:
char s[]=' 1234567890 ';
char * P1=s;
char * p2=S2;
memy (p2,p1,5)和memmove(p2,p1,5)的结果可能不同。Memmove()可以正确地将P1的前五个字符‘12345’复制到P2,但是memcpy()的结果可能不正确。
memcpy()、 memmove()和memccpy()
这三个函数的作用是将一个内存块复制到另一个内存块。前两个函数的区别在于,它们处理内存区域重叠的方式不同。第三个函数的作用也是复制内存,但是如果遇到某个值,会立即停止复制。
对于库函数,由于没有办法知道传递给它的内存区域,所以应该使用memmove()函数。有了这个功能,就可以保证不会出现内存块重叠的问题。对于应用程序,可以安全地使用memcpy()函数,因为代码“知道”两个内存块不会重叠。
关于memmove的实现:
void *mymemmove(void *dest,const void *src,size_t n)
{
字符温度[n];
int I;
char * d=dest
const char * s=src
for(I=0;I n;我)
temp[I]=s[I];
for(I=0;I n;我)
d[I]=temp[I];
返回目的地;
}
关于memcpy的实现:
void *mymemcpy(void *dest,const void *src,size_t n)
{
char * d=dest
const char * s=src
int * di
const int * si
int r=n % 4;
while (r -)
* d=* s;
di=(int *)d;
si=(const int *)s;
n/=4;
while (n -)
* di=*是;
返回目标;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。