C中的memset和memcpy有什么区别

Dir*_*irk 17 c memset memcpy

我已经阅读了函数头文件,但我仍然不确定在用例方面究竟有什么区别.

Pet*_*ter 42

memcpy()从一个地方复制到另一个地方.memset()只需将所有内存设置为相同的值.

例:

memset(str, '*', 50);   
Run Code Online (Sandbox Code Playgroud)

上面的行将字符串str的前50个字符设置为*(或memset的任何第二个参数).

memcpy(str2, str1, 50); 
Run Code Online (Sandbox Code Playgroud)

上面的行将str1的前50个字符复制到str2.

  • 值得指出的是mem*()函数*不知道字符串终止符.如果str1短于50个字符,上面的第二个例子会做坏事.当您已经验证了所涉及的长度时,对字符串数据使用mem*()函数是唯一安全的. (11认同)
  • 值得指出的是,如果你想复制两个字符串,请使用:strncpy(str2,str1,50); 这将安全地将str1复制到str2,在str1中检测到的第一个'\ 0'字符串终止符处停止复制,但是如果str1损坏或者超过50个字节,它将具有不会复制超过50个字符的安全网. (2认同)

Amb*_*ber 16

memset()将指定缓冲区中的所有字节设置为相同的值,memcpy()将字节序列从另一个位置复制到缓冲区.

char a[4];
memset(a, 7, sizeof(char)*4);
/*
* a is now...
*
* +-+-+-+-+
* |7|7|7|7|
* +-+-+-+-+
*/

char b[] = {1,2,3,4};
char c[4];
memcpy(c, b, sizeof(char)*4);
/*
* c is now...
*
* +-+-+-+-+
* |1|2|3|4|
* +-+-+-+-+
*/
Run Code Online (Sandbox Code Playgroud)

  • `sizeof a`和`sizeof c`分别比使用幻数更强大 (3认同)
  • @zenith 当然,对于具体的例子,但直到有人假设整数也是固定大小之前,这一切都很有趣和游戏。 (2认同)