该功能有什么用处memset()
?
定义:将 ptr 指向的内存块的前 num 字节设置为指定值(解释为无符号字符)。
这是否意味着它对内存地址中的值进行硬编码?
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;
}
也就是说,将从 address 开始的字节memset(b, c, l)
设置为 value 。它只是比上面的实现快得多。l
b
c
memset()
通常用于初始化值。例如考虑以下结构:
struct Size {
int width;
int height;
}
如果您像这样在堆栈上创建其中一个:
struct Size someSize;
然后该结构中的值将是未定义的。它们可能为零,它们可能是从上次使用堆栈的该部分时发生的任何值。所以通常你会遵循这条线:
memset(&someSize, 0, sizeof(someSize));
当然也可以用于其他场景,这只是其中之一。只需将其视为一种简单地将一部分内存设置为某个值的方法。
memset
无论数据类型如何,都是将内存区域设置为 0 的常用方法。可以说它memset
不关心数据类型,只是将所有字节设置为零。
恕我直言,在 C++ 中应该尽可能避免这样做memset
,因为它规避了 C++ 提供的类型安全性,而是应该使用构造函数或初始化作为初始化的手段。在类实例上完成的 memset 也可能无意中破坏某些东西:
例如
class A
{
public:
shared_ptr<char*> _p;
};
amemset
在上述实例上不会正确执行引用计数器减量。
我猜那serv_addr
是某种struct
类型的局部或全局变量struct sockaddr
- 可能是 - (或者可能是 a class
)。
&serv_addr
正在获取该变量的地址。它是一个有效的地址,作为 的第一个参数给出memset
。to的第二个参数memset
是用于填充的字节(零字节)。最后一个参数memset
是要填充的内存区域的大小(以字节为单位),即serv_addr
示例中该变量的大小。
因此,此调用清除了包含 somememset
的全局或局部变量。serv_addr
struct
实际上,GCC编译器在优化时会为此生成聪明的代码,通常是展开和内联它(实际上,它通常是内置的,因此GCC可以为它生成非常聪明的代码)。
只不过是将内存设置为特定值。
这是示例代码。
Memset(const *p,unit8_t V,unit8_t L) ,这里的 P 是指向目标内存的指针,V 是指向目标缓冲区的值,它将被设置为值 V,l 是数据的长度。
while(L --> 0)
{
*p++ = V;
}
memset- 设置内存中的字节数
概要-
#include<string.h>
void *memset(void *s,int c,size_t n)
描述- memset() 函数应将 c(转换为无符号字符)复制到 s 指向的对象的前 n 个字节中的每个字节中。 这里对于上述函数,memset() 应返回 s 值。