将void指针增加一个字节?两个?

Ada*_*m S 34 c c++ pointers

我有一个名为的void指针ptr.我想将这个值增加几个字节.有没有办法做到这一点?

请注意,我想在不创建任何更多变量的情况下就地执行此操作.

我能做点什么ptr = (void *)(++((char *) ptr));吗?

Jam*_*lis 62

您无法对void指针执行算术运算,因为指针算术是根据指向对象的大小定义的.

但是,您可以将指针强制转换为a char*,对该指针进行算术运算,然后将其转换回void*:

void* p = /* get a pointer somehow */;

// In C++:
p = static_cast<char*>(p) + 1;

// In C:
p = (char*)p + 1;
Run Code Online (Sandbox Code Playgroud)

  • @Balk:`static_cast`就足够了. (5认同)
  • 不应该是 reinterpret_cast 吗? (3认同)

Alo*_*ave 19

void指针上不能进行任何算术运算.

编译器不知道void指针指向的项的大小.您可以将指针强制转换为(char *)来执行此操作.

在GCC有它把一个的大小的扩展void1.所以可以在a void*上使用arithematic 来以字节为单位添加偏移量,但是使用它会产生不可移植的代码.

  • 在 GCC 中这是可能的,因为 `sizeof(void)` 会产生 `1`。 (2认同)
  • @Blagovest Buyukliev:它是 GCC 中的扩展,它将 void 的大小视为 1,使用它会产生不可移植的代码。 (2认同)
  • @Blag:一如既往,请用`-pedantic`编译.:) (2认同)

tda*_*ers 6

只是增加void*确实发生在gcc中工作:

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

int main() {
    int i[] = { 23, 42 };
    void* a = &i;
    void* b = a + 4;
    printf("%i\n", *((int*)b));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不过,从概念上(和正式地)来说,这是错误的,因此您需要使其明确:将其投射char*并返回。

void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);
Run Code Online (Sandbox Code Playgroud)

很明显,您要增加一定数量的字节。