繁体   English   中英

Memset 定义和使用

[英]Memset Definition and use

function memset()有什么用处?

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

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

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

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

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

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

struct Size {
    int width;
    int height;
}

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

struct Size someSize;

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

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

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

memset是一种将内存区域设置为0的常用方法,而与数据类型无关。 可以说memset不在乎数据类型,而只是将所有字节设置为零。

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

例如

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

上面实例的memset不能正确执行参考计数器递减。

我猜serv_addr是某些struct类型的本地变量或全局变量-也许是struct sockaddr (或者可能是一个class )。

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

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

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

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

这是示例代码。

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

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

memset-设置内存中的字节

概要-

#include<string.h>

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

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

serv_addr = {0};而不是增加对 memset 的例行调用开销; 也可以做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM