[英]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.