这与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
我有两个问题:
-pendandic-errors
或-Wpointer-arith
都没有抱怨程序我一开始误解了你在做什么。我以为您在void*
上进行数学运算。 C标准不允许这样做,但GCC(和clang)扩展会将其视为char*
上的数学来允许。
但是,您正在void**
上进行数学运算,这完全可以。 void*
是指针的大小,并且不是不确定的值。您可以创建void*
的数组,并且可以对void**
进行指针数学运算,因为它具有定义的大小。
因此您将永远不会收到void**
数学的警告,因为这不是问题。