51

该功能有什么用处memset()

定义:将 ptr 指向的内存块的前 num 字节设置为指定值(解释为无符号字符)。

这是否意味着它对内存地址中的值进行硬编码?

memset(&serv_addr,0,sizeof(serv_addr)是我试图理解的例子。

有人可以用非常简单的方式解释吗?

4

6 回答 6

56

memset()是一个相对简单的操作的非常快的版本:

void* memset(void* b, int c, size_t len) {
    char* p = (char*)b;
    for (size_t i = 0; i != len; ++i) {
        p[i] = c;
    }
    return b;
}

也就是说,将从 address 开始的字节memset(b, c, l)设置为 value 。它只是比上面的实现快得多。lbc

于 2012-11-10T23:40:35.297 回答
42

memset()通常用于初始化值。例如考虑以下结构:

struct Size {
    int width;
    int height;
}

如果您像这样在堆栈上创建其中一个:

struct Size someSize;

然后该结构中的值将是未定义的。它们可能为零,它们可能是从上次使用堆栈的该部分时发生的任何值。所以通常你会遵循这条线:

memset(&someSize, 0, sizeof(someSize));

当然也可以用于其他场景,这只是其中之一。只需将其视为一种简单地将一部分内存设置为某个值的方法。

于 2012-11-10T23:40:23.997 回答
10

memset无论数据类型如何,都是将内存区域设置为 0 的常用方法。可以说它memset不关心数据类型,只是将所有字节设置为零。

恕我直言,在 C++ 中应该尽可能避免这样做memset,因为它规避了 C++ 提供的类型安全性,而是应该使用构造函数或初始化作为初始化的手段。在类实例上完成的 memset 也可能无意中破坏某些东西:

例如

class A
{
public:
  shared_ptr<char*> _p;
};

amemset在上述实例上不会正确执行引用计数器减量。

于 2012-11-10T23:49:41.010 回答
3

我猜那serv_addr是某种struct类型的局部或全局变量struct sockaddr- 可能是 - (或者可能是 a class)。

&serv_addr正在获取该变量的地址。它是一个有效的地址,作为 的第一个参数给出memset。to的第二个参数memset是用于填充的字节(零字节)。最后一个参数memset是要填充的内存区域的大小(以字节为单位),即serv_addr示例中该变量的大小。

因此,此调用清除了包含 somememset的全局或局部变量。serv_addrstruct

实际上,GCC编译器在优化时会为此生成聪明的代码,通常是展开和内联它(实际上,它通常是内置的,因此GCC可以为它生成非常聪明的代码)。

于 2012-11-10T23:40:53.033 回答
2

只不过是将内存设置为特定值。

这是示例代码。

Memset(const *p,unit8_t V,unit8_t L) ,这里的 P 是指向目标内存的指针,V 是指向目标缓冲区的值,它将被设置为值 V,l 是数据的长度。

while(L --> 0)
{
    *p++ = V;
}
于 2012-12-20T09:06:30.563 回答
2

memset- 设置内存中的字节数

概要-

#include<string.h>

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

描述- memset() 函数应将 c(转换为无符号字符)复制到 s 指向的对象的前 n 个字节中的每个字节中。 这里对于上述函数,memset() 应返回 s 值。

于 2017-02-08T03:05:10.973 回答