函数memset()
的用处是什么?。
定义:将ptr指向的内存块的第一个num字节设置为 指定值(解释为unsigned char)。
这是否意味着硬编码内存地址中的值?
memset(&serv_addr,0,sizeof(serv_addr)
就是我想要了解的例子。
有人可以用非常简单的方式解释一下吗?
答案 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值。