【问题标题】:Operation on void pointer空指针操作
【发布时间】:2015-05-05 05:49:19
【问题描述】:

已知空指针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 是出乎意料的行为,我们不能依赖它。

现在继续讨论实际问题。我正在使用一个 void 指针数组。

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

Output:
0x7fff8824e050          
0x7fff8824e058

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

【问题讨论】:

  • 示例 1 不是未定义的行为,它甚至不是有效的 C 语言并且不会编译。如果它编译,您使用的是非标准编译器设置,它将void* 算术视为char*

标签: c pointers void


【解决方案1】:

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

是的,这是预期的行为。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多