为什么我们需要memset始终为零?
当我们使用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 = garbage
或not equals to 1
为什么?
你并不总是需要memset
为0,这仅仅是做最普通的(和有用)的事情。
memset
将每个字节设置为某个给定值。一个int
由4个字节,因此,当memset
荷兰国际集团到1
,你会设置每个那些4至1
,那么你就必须00000001 | 00000001 | 00000001 | 00000001
= 16843009
(第一数字是二进制,最后以十进制表示)。
另外 - 请注意,你永远不会为ab
分配内存。即使您的代码现在可以工作,但这并不安全。这将是:
abc ab;
memset(&ab, 0, sizeof(abc));
如程序中所示当定义变量时,默认情况下它将指向任何位置,并且任何垃圾数据都可以先前在那里可用。
我们通常将memset设置为(0)零以确保变量初始化为零,以便稍后在程序中我们可以相信分配给该变量的值是真正分配的值,而不是任何垃圾。
希望它可以帮助.....
为什么只用'0'?为什么不与其他任何价值? – 2013-02-22 07:05:48
Cuz“0”是设置任何内容的最常见值。现在假设,您将值设置为“3”。现在,相同的结构被其他人编写的任何其他应用程序读取。现在他会认为ab-> a = 3是一个有效值,并将用它来进一步处理数据。但是如果你发送ab-> a = 0,他会知道你的结构没有携带任何有效的数据,并且会停止执行。 – Abhineet 2013-02-22 07:13:56
因为我们都知道零表示什么都没有(空)。这就是为什么。 如果您想使用它进行比较,您可以尝试使用1,2到255的任何值。但是你应该知道memset适用于所有字节。 例如在你的情况下,结构体的int为成员,并假设int为4字节,它将为所有4个字节分配1,所以当你打印这个值时,你将不会得到1,但得到的是小数4369或0x1111。所以要小心。 – 2013-02-22 07:15:11
你memset()
使用内存设置的值取决于你的需求。就这样。没有人阻止你使用任何其他值来初始化内存。
首先你的程序得到了一个未定义的行为,这个reaosn是abc * ab的内存;永远不会分配!
其次要求字符串应该以“null”结尾,这意味着它是结束的,所以受此启发,我们在memset中使用null。但你可以使用任何你想要的值...
谈论'零'而不是'null'将会不那么模糊 – alk 2013-02-22 07:10:38
正如其他人所提到的,0
在很大程度上是任意的。但是,如果我们不得不选择的原因,这是为了方便(在安全的成本 - 你应该更喜欢明确初始化的变量,如果你曾经依赖于它们):
- 0大多理解为整数的初始值,符号或无符号的,因为它代表0不管宽度或端序
- 0是结束字符串
char*
小号 - 0是常0.0浮点数
- 0是常
NULL
在C,保证在C++中为NULL
0如何确保将浮点变量设置为0.0?语言的哪个部分标准保证? – 2013-02-22 07:19:23
@AlexeyFrunze:除语言标准外还有其他标准,其中一些标准更为普遍。 – 2013-02-22 07:24:30
@BenjaminLindley所以,您同意语言标准并不保证0.0代表wi所有零位? – 2013-02-22 07:31:38
因为'memset'将所有**字节**设置为指定值,而不是整个整数。 – sgarizvi 2013-02-22 06:57:37
你的程序永远不会分配指针'ab'的目的地。该程序是未定义的行为(但这并不一定是'ab-> a'不是其中的原因)。 – 2013-02-22 06:57:41
,因为0是初始值。 – 2013-02-22 07:00:16