防止在C中编译void **指针算法

问题描述 投票:0回答:1

这与Pointer arithmetic for void pointer in C相同,只是我的数据类型是void**而不是void*

#include <stdlib.h>
#include <stdio.h>

int main() {
    int foo [] = {1, 2};
    void* bar = &foo;
    void** baz = &bar;
    void** bazplusone = baz + 1;

    // cast to void* to make printf happy
    printf("foo points to %p\n", (void*)foo);
    printf("baz points to the address of bar and is %p\n", (void*)baz);
    printf("bazplusone is an increment of a void** and points to %p\n",(void*)bazplusone);
    return 0;
}

这将为我的gcc版本提供以下输出:

foo points to 0x7ffeee54e770
bar is a void* cast of foo and points to 0x7ffeee54e770
baz points to the address of bar and is 0x7ffeee54e760
bazplusone is an increment of a void** and points to 0x7ffeee54e768

我有两个问题:

  1. 根据C标准,这合法吗?
  2. 假设#1是false,有没有一种生成编译器错误的方法?都没有-pendandic-errors-Wpointer-arith都没有抱怨程序
c pointers void-pointers
1个回答
0
投票

我一开始误解了你在做什么。我以为您在void*上进行数学运算。 C标准不允许这样做,但GCC(和clang)扩展会将其视为char*上的数学来允许。

但是,您正在void**上进行数学运算,这完全可以。 void*是指针的大小,并且不是不确定的值。您可以创建void*的数组,并且可以对void**进行指针数学运算,因为它具有定义的大小。

因此您将永远不会收到void**数学的警告,因为这不是问题。

© www.soinside.com 2019 - 2024. All rights reserved.