2011-06-23 32 views
24

我有一個void指針ptr。我想通過多個字節增加這個值。有沒有辦法做到這一點?增加void指針一個字節?兩個?

請注意,我想在原地進行此操作而不創建任何更多變量。

我可以做點像ptr = (void *)(++((char *) ptr));嗎?

回答

48

由於指針算術是根據指向對象的大小定義的,因此無法對無效指針執行算術運算。

你可以,但是,轉換指針到char*,做那個指針運算,然後將其轉換回void*

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

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

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

不應該reinterpret_cast? – Balk

+4

@Balk:'static_cast'就足夠了。 –

15

指針void上的指針無法進行算術運算。

編譯器不知道指針指向的void項目的大小。您可以將指針投射到(char *)來執行此操作。

在gcc中有一個擴展名,它將void的大小視爲1。所以人們可以使用上的一個字節來增加一個字節偏移量,但是使用它會產生不可移植的代碼。

+0

在GCC這是可能的,因爲'的sizeof(無效)''產量1'。 –

+0

@Blagovest Buyukliev:它是GCC中的一個擴展,它將void的大小視爲1,使用它將產生非可移植的代碼。 –

+1

@Blag:一如既往,請用'-pedantic'編譯。 :) – Xeo

4

只是遞增void*確實發生在海灣合作委員會的工作:

#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; 
} 

儘管它在概念上(和官方)是錯誤的,所以你想明確說明它:把它轉換成char*然後回來。

void* a = get_me_a_pointer(); 
void* b = (void*)((char*)a + some_number); 

這使得顯而易見的是你增加了許多字節。

+1

一如既往,請用'-pedantic'編譯。 :)這是GCC不符合要求的擴展。 – Xeo

+0

猜我被寵壞了:) - 編輯正確的答案 – tdammers

-1

你可以這樣做:

++(*((char **)(&ptr))); 
+4

是的,但爲什麼_would_你?這是一個可怕的晦澀難懂的代碼,無法解析它正在做什麼,這是沒有道理的。另外,在C++中不鼓勵使用C風格的類型轉換,但這是這裏最少的問題。 –

+2

你也可以把一根火焰棒插入你的眼睛。它可能會比看'++(*((char **)(&ptr)));'傷害更少。 –