gpt4 book ai didi

C - 指针减法

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

我以为我理解了指针和指针算术,但后来我遇到了一些意想不到的事情。当我运行这段代码时,我想我会看到“(header+1) - header = 32”作为输出。但我没有。有人可以解释一下为什么会发生这种情况吗?

    struct metadata *header = (struct metadata *)malloc(sizeof(struct metadata));
printf("Struct size of : %d\n",sizeof(struct metadata));
printf("header = %d header+1 = %d\n",header,header+1);
printf("(header+1) - header = %d\n",(header+1) - header);

这给出了以下输出:

结构大小:32

header = 37704768 header +1 = 37704800

( header +1)- header = 1

最佳答案

来自standard 6.5.6

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements.

这里,如果您认为它是一个单元素数组,则有两个指针 - 其中一个指向该元素,另一个指针指向该元素。因此结果为 1。上面的规则显然告诉我们结果按指针指向的类型的大小按比例放大。

同样来自同一个standard 6.5.6其中指定指针可以指向数组元素后面的 1

Moreover, if the expression P points either to an element of an array object or one past the last element of an array object, and the expression Q points to the last element of the same array object, the expression ((Q)+1)-(P) has the same value as ((Q)-(P))+1and as -((P)-((Q)+1)), and has the value zero if the expression P points one past > the last element of the array object, even though the expression (Q)+1 does not point to an element of the array object

如果我将它们扔进 void *,我会得到 32,对吧?

是的。它将是 32(如果您使用的是 gcc)。 sizeof(void)=1 (gcc 是这样的 - 未指定标准),但其他编译器很可能会生成错误,可以使用 char* 解决。As sizeof char1 您可以使用 char* 转换来获得相同的结果。根据标准,这没有指定并且是非法的,因为 void 是不完整的类型。

最好使用 char* 转换来获取字节差异。

关于C - 指针减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044001/

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