gpt4 book ai didi

c - 不使用 * operator hack-y 方式获取产品

转载 作者:行者123 更新时间:2023-12-05 09:04:34 28 4
gpt4 key购买 nike

谁能帮我理解下面的逻辑如何解决获取ab的乘积?

int getProd(int a, int b){
return (uintptr_t)&((char (*) [a])0x0)[b];
}

最佳答案

假设我们有一个指针p,它指向大小为a的对象。

如果我们然后说p + b,我们要求一个指针指向p 指向的第b 个对象。

因此,实际的新指针值(无论如何在字节寻址的机器上)将按 a 缩放,即指向对象的大小。也就是说,“在引擎盖下”,编译器将执行更类似于 p + b * a 的操作。

所以我们可以看到乘法 a * b 正在发生——但随后它被添加到 p 的原始值。

因此,如果我们使用初始值 0,我们将只得到 a * b。这就是 hacky getProd 函数正在做的事情。

让我们分解一下:

                           0x0

值 0,在指针上下文中也称为 空指针。 [脚注:这个定义比较复杂,但我们暂时不要担心。]

              char (*) [a]

这是一个类型:“指向大小为 achar 数组的指针。

             (char (*) [a])0x0

这是一个转换:获取空指针,将其转换为“指向 char 的数组 [a] 的指针”类型。

            ((char (*) [a])0x0)[b]

获取该指针,假设它指向一个数组,然后获取该数组的第 b 个元素。由于数组索引与指针运算相同,因此最终将计算 0 + a * b

           &((char (*) [a])0x0)[b];

我们引用了“数组”的第 b 个元素。现在计算一个指向那个元素的指针。该指针的字面值应为 0 + a * b

(uintptr_t)&((char (*) [a])0x0)[b];

最后,获取该指针并将其转换为整数类型。


现在,综上所述,必须指出这是一个hack。以这种方式编写代码来对空指针执行算术运算是非常有问题的。它可能几乎但不完全合法;它可能是合法的,但几乎不合法。您可能会为答案落在这条线的哪一边争论几个小时。

当然,在这种情况下,这是一种学术争论,因为从来没有人会认真地提议以这种方式进行乘法运算。

关于c - 不使用 * operator hack-y 方式获取产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68445497/

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