2013-10-04 39 views
3

我一直以爲,這個指針遞增/遞減是這樣的操作:Void_ptr ++不起作用,但void_ptr + =確實

new_ptr=old_ptr+sizeof(type)*count 

所以爲int *那就是:

old_ptr=0  //int *ptr=0 
    count=1  //int count=1 
    new_ptr=old_ptr+sizeof(int)*count = 0+4*1 = 0x0004 //ptr+=count; 

和大小void = 0,所以使用+ =增加void_ptr不應該改變它。但我可能錯了。其他的事情是++運算符,它會引發錯誤。所以如果++拋出錯誤,爲什麼+ =不拋出呢? 示例代碼:

#include <stdio.h> 
void tell(const char *s,int *i,void *v){ 
    printf("%s: \n int_ptr: %#x\n void_ptr: %#x\n",s,i,v); 
} 
int main(){ 
    int *int_ptr=0; 
    void *void_ptr=0; 
    tell("Before",int_ptr,void_ptr); 
    int_ptr++; //int_ptr=int_ptr+sizeof(int); = 0x 0004 
    //void_ptr++; //error: ISO C++ forbids incrementing a pointer of type 'void*' 
    tell("After ++",int_ptr,void_ptr); 
    int_ptr+=1; //int_ptr=int_ptr+sizeof(int) = 0x0008 
    void_ptr+=1;//void_ptr=void_ptr+sizeof(void) WHY DOES THIS WORK AND ++ DOES NOT?!  = 0x0001 ?! should be 0x0000, because sizeof void = 0 
    tell("After +=",int_ptr,void_ptr); //RESULT: void_ptr=0x1, so does that mean, that sizeof void is 1 and it is not 0 
    return 0; 
} 

輸出:

Before: 
int_ptr: 0 
void_ptr: 0 
After ++: 
int_ptr: 0x4 
void_ptr: 0 
After +=: 
int_ptr: 0x8 
void_ptr: 0x1 

有人能解釋我嗎?

+6

這只是一個編譯器擴展。這不合法。 – jrok

+5

'「size = 0」' - no,[「void has no size」](http://stackoverflow.com/questions/1666224/what-is-the-size-of-void)。 – Dukeling

+5

標準不支持直接在'void *'上執行指針數學運算。 – WhozCraig

回答

5

無效指針的算術在C和C++中都是非法的。一些編譯器有允許它的擴展。

在這種情況下GCC具有pointer arithmetic擴展,它允許上void指針和函數指針,這兩者都是由標準非法算術。它把兩種,如果它它們指向一個類型的大小爲1

基本上它的,你應該避免在新的代碼兼容性黑客。

爲什麼++運算符拋出一個錯誤,當+ =不,我不知道。 ++用於在此擴展中的GCC中工作。也許是這個版本的GCC中的錯誤,或者是C++擴展的不一致應用。

+1

你能解釋爲什麼它在標準中不合法嗎?把它看作一個大小爲1的類型似乎是完全合乎邏輯的,只是爲了加/減而不是先將它轉換爲不同的類型。 – Codecat

+1

@Angelo Geels因爲任何時候你隱式地改變了另外定義好的行爲 - 比如使用被指向的對象的大小來計算指針 - 你很難找到錯誤。void不是一個對象類型,並且沒有大小,因此將它看作它的大小爲1,而不是它的大小,這不合邏輯,在某些情況下它只是方便的。明確地轉換爲大小爲1的類型意味着明確,並且不困難或特別乏味。 – Gerald

+0

感謝您的快速解釋:) – Codecat

0

So if ++ throws error, why does += not throw it too?

爲什麼GCC的行爲不同,是,恕我直言,一個簡單的人爲錯誤的結果:在GCC源宏TYPE_PTROB_P在某個地方使用,而它可能應該是TYPE_PTROBV_P

相關問題