为什么我不能通过这个指针黑客找到元素大小?

时间:2018-06-17 17:25:24

标签: c arrays pointers

在C

中考虑以下内容
&arr[0] => 0022FEB0

我的系统使用4个字节来存储int数据。 现在&arr[1]=>0022FEB4  并且在运行时int diff=&arr[1]-&arr[0];

现在

1

存储在差异中的值为4而不是{{1}}。

为什么?

6 个答案:

答案 0 :(得分:6)

这就是指针的工作方式。您没有计算字节差异。你正在计算元素数量的差异。

要获取元素大小,请使用sizeof(*arr)

要获得字节差异,请使用(&arr[1]-&arr[0]) * sizeof(*arr)

答案 1 :(得分:3)

我认为你想要的是这个:

int diff = (&arr[1]-&arr[0]) * sizeof(int);

当您告诉编译器您正在使用的数据类型时,它将在算术中考虑它。

答案 2 :(得分:2)

您没有计算字节差异。要计算字节差异,StackOverflow上已有答案。 这是一个回答Getting the difference between two memory addresses

的链接

答案 3 :(得分:1)

编译器知道那些指向int

的子类型
#include <stdio.h>
#include <stddef.h>

int main(void) {

    int arr[]= {1,2,3,4,5};

    /*
    int diff=&arr[1]-&arr[0];

    In your system, there's a 4 byte difference in memory, so you'd get diff = 1
    here because the compiler knows they're ints so the result is diff/sizeof(int)
    */

    uintptr_t firstNumAddress  = (uintptr_t)&arr[0];
    uintptr_t secondNumAddress = (uintptr_t)&arr[1];

    ptrdiff_t ptrDiff = secondNumAddress - firstNumAddress;
    printf("%lu - %lu = %ti\n", secondNumAddress, firstNumAddress, ptrDiff);

    return 0;
}

答案 4 :(得分:1)

您正在进行指针运算,而不是整数运算。

要进行整数算术,只需将地址转换为指针大小相同的整数类型(在32位系统中,可以是4个字节;在64位中,可以是8个字节)。

例如,在C中,只需执行:

int diff = (uintptr_t) &arr[1] - (uintptr_t) &arr[0];

你得到的是字节差异。

答案 5 :(得分:-1)

与中国相同 int diff =(*)(a+1-0)
它是产生结果的代码源。