bzero静态内存与动态内存

时间:2018-08-28 03:04:12

标签: c

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

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字节是有效的,在我打印后,计算机可以在堆栈中找到什么。

2 个答案:

答案 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)

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