gpt4 book ai didi

c - 读取未初始化的整数时出现不可预测的行为

转载 作者:行者123 更新时间:2023-11-30 20:53:11 25 4
gpt4 key购买 nike

有人可以向我解释一下为什么*x始终返回 0*(x + 1)返回类似 -805306368 的值, 536870912

int * x = malloc(sizeof(int) * 2);
printf("%d, %d\n", *x, *(x + 1));

我正在使用gcc ,但也经历了与 clang 相同的行为。

我的理解是malloc将在堆上为两个 int 分配足够的内存值(value)观。我假设*x将引用第一个未初始化的 int*(x + 1)将引用第二个未初始化的 int .

我认为这不是 this 的重复项因为*x总是 0 。我很清楚为什么*(x + 1)返回“垃圾”,但原因较少*x如此一致0 .

最佳答案

*x 相当于 *(x + 0)*(x + n) 相当于 x[ n],其中 x 是指针,n 是整数。因此,您将打印 x[0]x[1] - 整数数组的第一个和第二个元素。

<小时/>

除非初始化,否则用 malloc 分配的对象的字节不确定,因此对象的值也是如此。标准说(C11 3.19.2-3.9.4; same text in C17 but cannot link it as nicely):

indeterminate value

either an unspecified value or a trap representation

unspecified value

valid value of the relevant type where this International Standard imposes no requirements on which value is chosen in any instance

NOTE An unspecified value cannot be a trap representation.

trap representation

an object representation that need not represent a value of the object type

int 对象在 GCC 中不能有陷阱表示。然而,该行为仍然没有明确规定,因为标准没有对在任何实例中选择哪个值强加要求 - 所以即使

printf("%d, %d\n", x[0], x[0]);

可以打印

0, 42

所以“检查”不确定的值是没有意义的。

“as-if 规则”允许编译器完全省略对 malloc 的调用 - 这样即使 malloc 实现总是给出前 4 个字节的 block 归零后,编译后的代码可能会出现任何变化的 x[0] 数字。

关于c - 读取未初始化的整数时出现不可预测的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542874/

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