空指针操作

Operation on void pointer

已知void指针airthmetic无效

int main {
    int b = 10;
    void *a = (void *) &b;
    void *c = a + 1;
    printf ("%p\n", a);
    printf ("%p\n", c);
}

    Output:
     0x7fff32941d1c             
     0x7fff32941d1d

我读到上述 airthmetic 是意外行为,我们不能依赖它。

现在进入实际问题。我正在获取一个空指针数组。

int main()
{
    void *a[10];
    void **b = a;
    void **c = (a + 1);
    printf ("%p\n", b);
    printf ("%p\n", c);
}

Output:
0x7fff8824e050          
0x7fff8824e058

您能否解释一下上面的行为,其中使用了双指针(指向 void 指针的指针)。这是预期的行为吗?

Can you please explain the above behavior, where a double pointer (pointer to a void pointer is used). Is it expected behavior?

是的,这是预期的行为。

那是因为指针指向的对象的大小是已知的。是sizeof(void*).

如果指针的值用纯整数值表示,

(a + 1) == a + 1*sizeof(void*)

在您的平台上,sizeof(void*) 似乎是 8