我的问题是:这两行之间有什么区别?
set
之所以这样问,是因为当我想打印int ptr[4046];
bzero(ptr, 4046);
int *ptr;
ptr = (int *)malloc(sizeof(int) * 4046);
bzero(ptr, 4046);
时,第一个打印出0,然后乱码(随机数),第二个打印(ptr
)只打印0,就像我一样想。我使用malloc
进行打印,如下所示:
printf
编辑: 谢谢大家, 答:int的大小不是1个字节,而是4个字节。因此第一个4046字节是有效的,在我打印后,计算机可以在堆栈中找到什么。
答案 0 :(得分:4)
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++]);
答案 1 :(得分:0)
第一个在堆栈上分配内存,第二个在堆上分配