C b0静态内存与动态内存

C b0静态内存与动态内存,c,C,我的问题是:这两行之间有什么区别: int ptr[4046]; bzero(ptr, 4046); int *ptr; ptr = (int *)malloc(sizeof(int) * 4046); bzero(ptr, 4046); 我这样问是因为当我想打印ptr时,第一个打印一些0,然后是垃圾(随机数),第二个(mallocone)只打印0,就像我想的那样。我使用printf来打印它,如下所示: int i = 0; while (i++ < 4046) printf("%

我的问题是:这两行之间有什么区别:

int ptr[4046];
bzero(ptr, 4046);

int *ptr;
ptr = (int *)malloc(sizeof(int) * 4046);
bzero(ptr, 4046);
我这样问是因为当我想打印
ptr
时,第一个打印一些0,然后是垃圾(随机数),第二个(
malloc
one)只打印0,就像我想的那样。我使用
printf
来打印它,如下所示:

int i = 0;
while (i++ < 4046)
  printf("%x", ptr[i]);
inti=0;
而(i++<4046)
printf(“%x”,ptr[i]);
编辑: 谢谢大家,,
答:整数的大小不是1字节,而是4字节。因此,第一个4046字节是有效的,在我打印出计算机在堆栈上可以找到的内容之后。

第一个字节在堆栈上分配内存,第二个字节在堆上分配内存。

无论是在堆栈上还是在堆上分配内存,其工作方式都没有区别。真正的问题在于如何打印内容:

int i = 0;
while (i++ < 4048)
  printf("%x", ptr[i]);

bzero是一个遗留例程:不知道实现是什么。尝试memset,看看是否得到相同的结果。@jenesaisquoi这不是真的。事实恰恰相反。静态链接(全局、静态)初始化为零;不是自动的。通过澄清你的问题(以及阻止错误信息,其中似乎有很多)来阻止即将到来的对你没有真正提出的问题的大量回答。您是否观察到
bzero
似乎没有完全归零基于堆栈的数组,但似乎在动态数组上正常工作,您想知道原因吗?您似乎知道动态存储和自动存储之间的区别。那么,这是关于
bzero
显然没有像你期望的那样工作吗?@WhozCraig:你是对的,但这仍然不符合描述。如果编译器的行为类似于抽象机器,那么该代码将在最后生成一个垃圾值,而不是“随机数”。@AnT描述为“第一个打印0,然后是垃圾”。它没有具体说明有多少0和多少垃圾,或者像通常那样使用for循环。我只是希望OP没有放弃这一点。是的,你是对的,我只做了一次。谢谢但是错误发生在其他地方。我在代码中使用
int*
而不是
char*
。字符的大小与int(1和4)不同
int i = 0;
while (i < 4048)
  printf("%x", ptr[i++]);