Memset定义和使用

时间:2012-11-10 23:36:36

标签: c++ c function

函数memset()的用处是什么?。

  

定义:将ptr指向的内存块的第一个num字节设置为   指定值(解释为unsigned char)。

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

memset(&serv_addr,0,sizeof(serv_addr)就是我想要了解的例子。

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

6 个答案:

答案 0 :(得分:45)

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;
}

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

答案 1 :(得分:36)

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

struct Size {
    int width;
    int height;
}

如果您在堆栈中创建其中一个,如下所示:

struct Size someSize;

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

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

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

答案 2 :(得分:8)

无论数据类型如何,

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

在C ++中使用IMHO时,应该避免在可能的情况下执行memset,因为它绕过了C ++提供的类型安全性,而应该使用构造函数或初始化作为初始化的方法。在类实例上完成的memset也可能无意中破坏某些东西:

e.g。

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

上述实例上的memset不能正确地减少参考计数器。

答案 3 :(得分:3)

我想serv_addr是某些struct类型的局部变量或全局变量 - 或许struct sockaddr - (或者可能是class)。

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

因此,此次memset调用会清除包含某些serv_addr的全局或局部变量struct

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

答案 4 :(得分:1)

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

以下是示例代码。

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

while(L --> 0)
{
    *p++ = V;
}

答案 5 :(得分:0)

memset-在内存中设置字节

概要 -

#include<string.h>

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

描述 - memset()函数应将c(转换为unsigned char)复制到s指向的对象的前n个字节中。 对于上面的函数,memset()应该返回s值。