c ++-Memset定义和我们

函数memset(&serv_addr,0,sizeof(serv_addr)的作用是什么?

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

这是否意味着它在内存地址中硬编码一个值?

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

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

Brandon Ling asked 2020-07-29T21:57:11Z
6个解决方案
48 votes

memset(b, c, l)是相对简单的操作的非常快速的版本:

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)将从地址b开始的l字节设置为值c。这样做的速度比上述实现要快得多。

Dietmar Kühl answered 2020-07-29T21:58:20Z
38 votes

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

struct Size {
    int width;
    int height;
}

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

struct Size someSize;

然后该结构中的值将是不确定的。 它们可能为零,也可能是上次使用那部分堆栈时发生的任何值。 所以通常您会遵循以下原则:

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

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

mattjgalloway answered 2020-07-29T21:58:54Z
10 votes

memset是将存储区域设置为0的通用方法,而不管数据类型如何。 可以说memset不在乎数据类型,而只是将所有字节设置为零。

C ++中的恕我直言,应该尽可能避免执行memset,因为它绕过了C ++提供的类型安全,而应该使用构造函数或初始化作为初始化的手段。 在类实例上完成的memset也可能会无意中破坏某些内容:

例如

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

上述情况下的memset不会正确执行参考计数器递减。

Anders answered 2020-07-29T21:59:27Z
3 votes

我猜memset是某些serv_addr类型的局部或全局变量-也许是struct-(或可能是memset)。

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

因此,此对memset的调用将清除包含一些struct的全局或局部变量serv_addr

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

Basile Starynkevitch answered 2020-07-29T22:00:01Z
2 votes

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

这是示例代码。

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

while(L --> 0)
{
    *p++ = V;
}
Vino answered 2020-07-29T22:00:30Z
1 votes

memset-设置内存中的字节

概要-

#include<string.h>

无效* memset(无效* s,int c,size_t n)

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

Ashit answered 2020-07-29T22:01:03Z
translate from https://stackoverflow.com:/questions/13327155/memset-definition-and-use