gpt4 book ai didi

c - bzero 静态内存与动态内存

转载 作者:行者123 更新时间:2023-12-02 13:11:00 26 4
gpt4 key购买 nike

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

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 的工作方式都没有区别。真正的问题在于如何打印内容:

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++]);

关于c - bzero 静态内存与动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52049488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com