我的问题是:这两句话有什么区别?
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字节是有效的,在我打印出计算机可以在堆栈上找到什么之后。
发布于 2018-08-28 03:21:29
无论是在堆栈上还是在堆上分配内存,bzero的工作方式都没有区别。真正的问题在于如何打印内容:
int i = 0;
while (i++ < 4048)
printf("%x", ptr[i]);在循环的第一次迭代中,将i (0)的值与4048进行比较。它较少,因此输入循环,但不是在i增加之前。然后打印ptr[i]的值,即ptr[1]。所以你跳过打印第一个值。
向前跳到最后,i是4047,小于4048,因此输入了循环,并且在进入循环体之前再次增加了i。然后打印ptr[4048]的值,但是这个值超过了数组/分配内存的末尾,所以读取它会调用未定义的行为。在这种情况下,UB显示为两种情况中的每一种都打印的不同的垃圾值。
您需要修复该循环以执行循环主体内的增量:
int i = 0;
while (i < 4048)
printf("%x", ptr[i++]);https://stackoverflow.com/questions/52049488
复制相似问题