【问题标题】:What is the difference between memset and memcpy in CC中的memset和memcpy有什么区别
【发布时间】:2010-12-04 21:27:18
【问题描述】:

我已经阅读了函数头,但我仍然不确定在用例方面到底有什么区别。

【问题讨论】:

  • 标题通常不是查找文档的最佳位置。在 C 的情况下,最终参考是标准,但任何体面的参考文本(例如 K&R、H&S)都应该充分描述标准库函数。
  • cplusplus.com也有很好的在线参考。
  • 或 opengroup.org(管理 POSIX 标准)。如果你使用 cplusplus.com,你必须忽略关于 C++ 的东西......

标签: c memcpy memset


【解决方案1】:

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

例子:

memset(str, '*', 50);   

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

memcpy(str2, str1, 50); 

以上行将str1的前50个字符复制到str2。

【讨论】:

  • 值得指出的是,mem*() 函数知道字符串终止符。如果 str1 小于 50 个字符,上面的第二个示例将做坏事。只有当您已经验证了所涉及的长度时,才对字符串数据使用 mem*() 函数是安全的。
  • 绝对。仅以此为例。
  • 值得指出的是,如果您确实想复制两个字符串,请使用:strncpy(str2, str1, 50);这将安全地将 str1 复制到 str2,在它在 str1 中检测到的第一个 '\0' 字符串终止符处停止复制,但如果 str1 损坏或超过 50 个字节,它不会复制超过 50 个字符。跨度>
  • 当然 strncpy 在 strcpy 可以工作的某些情况下会出错:例如,如果您已将 str2 设置为尽可能长(即 str1 的长度,为 nul 终止符留有空间),但是str2 实际上比您的 50 字符限制短。 strncpy 不是 strcpy 的安全版本,它只是有不同的陷阱。在任何情况下都使用(或重新实现)strcpy_s:它总是以 nul 终止结果,而 strncpy 并不总是以 nul 终止。 strcpy_s 也会失败,而不是截断过长的字符串:截断通常会导致另一个错误。
  • 嗯,这是正确的,但更具体地说,mem*() 函数根本不知道也不关心字符串。他们处理记忆。
【解决方案2】:

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|
* +-+-+-+-+
*/

【讨论】:

  • 可能值得注意的是,sizeof(char) 根据定义是1,所以sizeof(char)*s 是多余的。
  • @zenith 当然,对于具体的例子,但在有人假设整数也是固定大小之前,这一切都很有趣和游戏。
  • sizeof asizeof c 分别比使用幻数更健壮
  • 您没有说明to the same value 的大小。例如,它可以是一个结构吗?
  • @Amber 我只是假设ints 的大小是固定的,并且在我早上用memset 进行了段错误
【解决方案3】:

memset 将内存块设置为单个值。 memcpy 将一个块的内容复制到另一个块中。

也许您会对memcpymemmove 之间的区别感兴趣。两者的作用相同,但即使源和目标重叠,后者也能正常工作。

【讨论】:

  • 您没有明确说明single value 的大小。我目前正在盯着memset(buf, (int)(54 + n), 1);,因为我想知道第三个参数1 会将整个int 写入buf,但它并没有而是只写入整数的最低有效字节。
  • 它是一个单字节 (char),因为这是 memset 采用的类型。您的号码在函数调用中被截断。
【解决方案4】:

memset() 用于将内存块中的所有字节设置为特定的 char 值。 Memset 也只适用于 char,因为它是它的初始化值。

memcpy() 在内存之间复制字节。这种被复制的数据是无关紧要的,它只是逐字节复制。

【讨论】:

  • 我喜欢这个答案是因为to a particular char value
【解决方案5】:

memset 用常量字节填充 内存

void *memset(void *s, int c, size_t n);

memset 的使用是程序员可以直接用特定的方式填充内存。 并且 memcpy 使用 constant 指向无法更改的源的 void 指针。

memcpy 复制内存区域

void *memcpy(void *dest, const void *src, size_t n);

参考memcpy memset

【讨论】:

  • 好,你在 memset 中描述了with constant byte
  • 谢谢@truthadjustr 我很高兴这个答案很有帮助
【解决方案6】:

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

例如这里将字符串 str 的字符串长度设置为 *(或 memset 的任何第二个参数)。

memset(str, '*', strlen(str)+1);   

这里将字符串src的字符串长度复制到dest。

memcpy(dest, src, strlen(src)+1);

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2014-03-01
    • 2011-04-05
    • 2016-07-11
    相关资源
    最近更新 更多