2011-11-06 137 views
0

可能重複:
void * arithmetic增加一個空指針

嗨,大家好我有一個關於在C.首先指針增加一個小問題,讓我們說,我知道ptr++,其中ptr是一個指針將增​​加與sizeof(*ptr)一樣多。另外我知道在做*ptr時,編譯器知道它必須從內存中獲取sizeof(*ptr)字節。

第二部分幫助我理解爲什麼以下甚至不編譯:

int main(){ 
int a = 3; 
void* b = &a; 
printf("%d\n", *b); 
return 0; 
} 

因爲編譯器不知道void類型的變量的大小。不過,我有點困惑下面的代碼:

int main(){ 
int a = 3; 
void* b = &a; 
printf("%p\n", b); 
b++; 
printf("%p\n", b); 
} 

所以,我的兩個問題是:

  1. 如何能夠知道編譯器多少應該增加b

  2. 爲什麼它只增加一個字節(至少在我的機器是一個字節)?

+0

http://stackoverflow.com/questions/3922958/void-arithmetic – cnicutar

+0

第一段代碼的'printf'行的所有尾部空白是什麼?啊! – pmg

回答

7

1)它沒有,2)這是未定義的行爲。 void是一個不完整的類型,所以它沒有一個明確的大小,所以你不能用它的指針做指針運算。

通常情況下,您會希望char指針用於按字節存儲器的提示。

如果您在編譯時啓用了所有編譯器警告,您將發現此類有問題的代碼。

+1

那麼,你不一定需要警告,但你應該嘗試其中的一些大小。 –

+0

@ChrisLutz:在GCC中,我會推薦'-W -Wall -Wextra -pedantic'(因此「all」),這給了你一個非常好的基礎。編譯器提供了一些更深奧的和主觀的警告(比如''WeffC++'用於C++檢查是否符合Scott Meyers的C++書籍!),我很樂意跳過;-)基本上任何警告都可以讓你知道公然濫用的語言應該啓用... –

+0

gcc提供算術上的空指針作爲擴展雖然。在進行算術時,它將大小視爲1。 http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Pointer-Arith.html – nos