【发布时间】:2019-02-02 14:13:17
【问题描述】:
我的问题是:这两行有什么区别:
int ptr[4046];
bzero(ptr, 4046);
int *ptr;
ptr = (int *)malloc(sizeof(int) * 4046);
bzero(ptr, 4046);
我问这个是因为当我想打印ptr 时,第一个打印一些 0,然后是垃圾(随机数),第二个(malloc 一个)只打印 0,就像我想的那样。我使用printf 来打印它,像这样:
int i = 0;
while (i++ < 4046)
printf("%x", ptr[i]);
编辑: 谢谢大家, 答:一个 int 的大小不是 1 个字节而是 4 个字节。所以第一个 4046 字节是有效的,在我打印出计算机可以在堆栈中找到的内容之后。
【问题讨论】:
-
bzero 是一个遗留例程:不知道实现是什么。试试 memset,看看你是否得到相同的结果。
-
@jenesaisquoi 这不是真的。事实上,恰恰相反。静态链接(全局、静态)初始化为零;不是自动的。
-
通过澄清您的问题(以及阻止错误信息,其中似乎有很多),停止对您实际上未提出的问题的大量答案。您是否观察到
bzero似乎没有将基于堆栈的数组完全归零,但似乎在动态数组上正常运行,您想知道为什么?您似乎知道动态存储和自动存储之间的区别。那么,这是关于bzero显然没有按您预期的那样工作吗? -
@WhozCraig:你是对的,但这仍然不符合描述。如果编译器的行为类似于抽象机器,那么这段代码最后会产生一个垃圾值,而不是“随机数”。
-
@AnT 描述是“第一个打印一些 0 然后是垃圾”。它并没有具体说明有多少个 0 和多少垃圾。
标签: c