C void指针算术

Iva*_*van 5 c pointers

我认为在gcc中,void*和char*在指针运算方面的处理方式相同,即void*"指向"内存中的单个字节,因此下面的代码

void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
Run Code Online (Sandbox Code Playgroud)

确实回来了0x984a008 0x984a009.类似地,void**指向一个指针,因此增加1实际上意味着增加4个字节(在32位OS上),即

void **p;
p = (void **) malloc(sizeof(void *));
printf("%p %p\n",p,p+1);
Run Code Online (Sandbox Code Playgroud)

回报0x984a008 0x984a00c.但是,以下代码让我感到困惑

void **p, *p1;
p = (void **) malloc(sizeof(void *));
p1 = (void **) p;
printf("%p %p\n",p1,p1+1);
Run Code Online (Sandbox Code Playgroud)

因为它又回来了0x984a008 0x984a009.这里发生了什么?

Duk*_*ing 7

void暂时忽略指针运算的可能未定义行为......

类型p1void *.

您不能通过为其指定不同类型的值来更改变量的类型.p1将永远留下来void *.

分配给它的任何不同类型的表达式将被隐式地转换为void *(或者如果不能则给出错误).

因此它与第一个例子基本相同.

编辑:

据我所知,从一种指针类型转换到另一种指针类型实际上并没有做任何事情,其主要目的是进行类型检查.

指针只是一个内存地址,一个数字,所以内存看起来像:(分配后)

  p1       p2
void *   void** <- these types are fixed and known during compilation
------   ------
|1234|   |1234|         at address 1234 = the 4 bytes from malloc
------   ------
  ^
  |
this value is the only thing that will change by assigning p1 to a different value
Run Code Online (Sandbox Code Playgroud)

  • 在某些体系结 但是,在典型的x86(_64)体系结构中,您可以期望所有指针具有相同的表示形式,并且强制转换为无操作. (3认同)

Ale*_*lex 1

void 指针不能递增。这是未定义的行为。

相关问题: 将void指针增加一个字节?两个?