gpt4 book ai didi

关于 sizeof 溢出 size_t 的 C 标准

转载 作者:太空狗 更新时间:2023-10-29 16:55:58 26 4
gpt4 key购买 nike

这是未定义的行为吗?标准相关部分就不多说了。

size_t n = SIZE_MAX / sizeof(double) + 1;
size_t m = sizeof(double[n]);

最佳答案

C 标准并未明确声明 size_t 类型足以处理所有对象或类型的大小,尤其是对于未实际实例化的假设类型。

在 C 2018 7.19 2 中,标准规定 size_t “是 sizeof 运算符结果的无符号整数类型”。这告诉我们有关类型 size_t 的信息,但没有告诉我们计算过程中可能出现的。在 5.2.4 中,标准承认 C 实现必然有限制,并且它们必须在不同的点上崩溃。

7.19 4 说“用于 size_tptrdiff_t 的整数转换级别不应大于 signed long int 除非该实现支持足够大的对象以使其成为必要。”这重申了我们希望 size_t 能够表示所有受支持对象的大小,特别是因为它意味着对象的存在使得 size_t 能够表示“必要”来表示它,但这并不是 size_t 必须这样做的明确声明,也不适用于可以描述但不能实例化为对象的假设类型。

如果我们评估 n * sizeof(double),我们知道结果:6.2.5 9 说“涉及无符号操作数的计算永远不会溢出,因为结果不能用结果无符号整数类型以比结果类型可以表示的最大值大 1 的数字为模进行缩减。”但是,对于 sizeof(double[n]),并不完全清楚这是否适用,因为虽然 n 是无符号的,但它不是 sizeof 的直接操作数,其中计算无法表示的结果。该标准没有明确告诉我们这个 sizeof 的结果将以相同的方式减少。

因此,此操作不在 C 标准中。

关于关于 sizeof 溢出 size_t 的 C 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57764670/

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