2

每当我们使用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 = garbage或的值not equals to 1

为什么?

4

5 回答 5

13

你并不总是需要memset0,这只是最常见(和有用)的事情。

memset将每个字节设置为某个给定值。Anint由 4 个字节组成,因此,当memseting to时1,您将这 4 个中的每一个设置为1,然后您将拥有00000001 | 00000001 | 00000001 | 000000012 = 1684300910(第一个数字是二进制的,最后一个是十进制的)。

另外 - 请注意,您永远不会为ab. 即使您的代码现在可以工作,它也不安全。这将是:

abc ab;
memset(&ab, 0, sizeof(abc));
于 2013-02-22T07:07:36.360 回答
4

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

  • 0 主要被理解为整数的初始值,有符号或无符号,因为无论宽度或字节顺序如何,它都表示 0
  • 0 是char*s的字符串结尾
  • 对于浮点数,0 通常是 0.0
  • 0 通常NULL在 C 中,保证NULL在 C++ 中
于 2013-02-22T07:12:18.730 回答
2

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

于 2013-02-22T07:07:53.920 回答
1

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

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

希望能帮助到你.....

于 2013-02-22T07:01:44.173 回答
1

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

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

于 2013-02-22T07:09:20.363 回答