为什么我们需要memset始终为零?

时间:2013-02-22 06:55:57

标签: c++ c

每当我们使用memset时,我们都将其设置为零。

为什么呢?为什么不用1或2或其他东西。

此外,将结构设置为0似乎有效但设置为1则不起作用:

typedef struct abc{
    int a;
} abc;

int main()
{
    abc* ab;
    memset(ab, 0, sizeof(abc));// it sets abc->a = 0; correct
}

但如果我使用0,则代替1

memset(ab, 1, sizeof(abc));

然后是abc->a = garbagenot equals to 1

的值

为什么?

5 个答案:

答案 0 :(得分:11)

您并不总是需要memset为0,这只是最常见(也很有用)的事情。

memset将每个字节设置为某个给定值。 int由4个字节组成,因此,当memset 1时,您将这4个中的每个设置为1,那么您就可以了有00000001 | 00000001 | 00000001 | 00000001 2 = 16843009 10 (第一个数字是二进制数,最后一个数字是十进制数。)

另外 - 请注意,您永远不会为ab分配内存。即使您的代码现在可以正常工作,但它并不安全。这将是:

abc ab;
memset(&ab, 0, sizeof(abc));

答案 1 :(得分:2)

您使用memset()设置内存的值取决于您的需求。就这样。没有人阻止你使用任何其他值来初始化内存。

答案 2 :(得分:2)

正如其他人所说,0在很大程度上是武断的。但是,如果我们必须选择原因,那是为了方便(以安全为代价 - 如果你依赖它们,你应该更愿意显式初始化变量):

  • 0大多数被理解为整数的初始值,有符号或无符号,因为无论宽度或字节顺序如何它都代表0
  • 0是char* s
  • 的字符串结尾 对于浮点数,
  • 0通常为0.0
  • 0在C中通常为NULL,在C ++中保证为NULL

答案 3 :(得分:1)

如你的程序所示当定义变量时,默认情况下它将指向任何位置,并且之前可以使用任何垃圾数据。

我们通常将memset设置为0以确保将变量初始化为零,以便稍后在程序中我们可以信任分配给变量的值是真正赋值而不是任何垃圾。

希望它有所帮助......

答案 4 :(得分:1)

首先你的程序有一个未定义的行为,reaosn是abc * ab的内存;永远不会分配!

其次要求字符串应以“null”结尾,这意味着它是结束,所以受此启发我们在memset中使用null。但是你可以使用你想要的任何价值......