我有一個void指針ptr
。我想通過多個字節增加這個值。有沒有辦法做到這一點?增加void指針一個字節?兩個?
請注意,我想在原地進行此操作而不創建任何更多變量。
我可以做點像ptr = (void *)(++((char *) ptr));
嗎?
我有一個void指針ptr
。我想通過多個字節增加這個值。有沒有辦法做到這一點?增加void指針一個字節?兩個?
請注意,我想在原地進行此操作而不創建任何更多變量。
我可以做點像ptr = (void *)(++((char *) ptr));
嗎?
由於指針算術是根據指向對象的大小定義的,因此無法對無效指針執行算術運算。
你可以,但是,轉換指針到char*
,做那個指針運算,然後將其轉換回void*
:
void* p = /* get a pointer somehow */;
// In C++:
p = static_cast<char*>(p) + 1;
// In C:
p = (char*)p + 1;
指針void
上的指針無法進行算術運算。
編譯器不知道指針指向的void
項目的大小。您可以將指針投射到(char *
)來執行此操作。
在gcc中有一個擴展名,它將void
的大小視爲1
。所以人們可以使用上的一個字節來增加一個字節偏移量,但是使用它會產生不可移植的代碼。
在GCC這是可能的,因爲'的sizeof(無效)''產量1'。 –
@Blagovest Buyukliev:它是GCC中的一個擴展,它將void的大小視爲1,使用它將產生非可移植的代碼。 –
@Blag:一如既往,請用'-pedantic'編譯。 :) – Xeo
只是遞增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);
這使得顯而易見的是你增加了許多字節。
你可以這樣做:
++(*((char **)(&ptr)));
是的,但爲什麼_would_你?這是一個可怕的晦澀難懂的代碼,無法解析它正在做什麼,這是沒有道理的。另外,在C++中不鼓勵使用C風格的類型轉換,但這是這裏最少的問題。 –
你也可以把一根火焰棒插入你的眼睛。它可能會比看'++(*((char **)(&ptr)));'傷害更少。 –
不應該reinterpret_cast? – Balk
@Balk:'static_cast'就足夠了。 –