2013-02-22 20 views
2

当我们使用memset时,我们将它设置为零。为什么我们需要memset始终为零?

为什么?为什么不与1或2或别的东西。

此外,结构设置为0,似乎工作,但设置为1不会:如果我使用1

typedef struct abc{ 
    int a; 
} abc; 

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

但是,相反的0

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

那么的价值abc->a = garbagenot equals to 1

为什么?

+1

因为'memset'将所有**字节**设置为指定值,而不是整个整数。 – sgarizvi 2013-02-22 06:57:37

+1

你的程序永远不会分配指针'ab'的目的地。该程序是未定义的行为(但这并不一定是'ab-> a'不是其中的原因)。 – 2013-02-22 06:57:41

+0

,因为0是初始值。 – 2013-02-22 07:00:16

回答

11

你并不总是需要memset为0,这仅仅是做最普通的(和有用)的事情。

memset将每个字节设置为某个给定值。一个int由4个字节,因此,当memset荷兰国际集团到1,你会设置每个那些4至1,那么你就必须00000001 | 00000001 | 00000001 | 00000001 = 16843009 (第一数字是二进制,最后以十进制表示)。

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

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

如程序中所示当定义变量时,默认情况下它将指向任何位置,并且任何垃圾数据都可以先前在那里可用。

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

希望它可以帮助.....

+0

为什么只用'0'?为什么不与其他任何价值? – 2013-02-22 07:05:48

+0

Cuz“0”是设置任何内容的最常见值。现在假设,您将值设置为“3”。现在,相同的结构被其他人编写的任何其他应用程序读取。现在他会认为ab-> a = 3是一个有效值,并将用它来进一步处理数据。但是如果你发送ab-> a = 0,他会知道你的结构没有携带任何有效的数据,并且会停止执行。 – Abhineet 2013-02-22 07:13:56

+0

因为我们都知道零表示什么都没有(空)。这就是为什么。 如果您想使用它进行比较,您可以尝试使用1,2到255的任何值。但是你应该知道memset适用于所有字节。 例如在你的情况下,结构体的int为成员,并假设int为4字节,它将为所有4个字节分配1,所以当你打印这个值时,你将不会得到1,但得到的是小数4369或0x1111。所以要小心。 – 2013-02-22 07:15:11

2

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

1

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

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

+0

谈论'零'而不是'null'将会不那么模糊 – alk 2013-02-22 07:10:38

2

正如其他人所提到的,0在很大程度上是任意的。但是,如果我们不得不选择的原因,这是为了方便(在安全的成本 - 你应该更喜欢明确初始化的变量,如果你曾经依赖于它们):

  • 0大多理解为整数的初始值,符号或无符号的,因为它代表0不管宽度或端序
  • 0是结束字符串char*小号
  • 0是常0.0浮点数
  • 0是常NULL在C,保证在C++中为NULL
+0

0如何确保将浮点变量设置为0.0?语言的哪个部分标准保证? – 2013-02-22 07:19:23

+1

@AlexeyFrunze:除语言标准外还有其他标准,其中一些标准更为普遍。 – 2013-02-22 07:24:30

+0

@BenjaminLindley所以,您同意语言标准并不保证0.0代表wi所有零位? – 2013-02-22 07:31:38