2014-09-19 52 views
0

你好int指針類型鑄造與字符指針拋出意外的輸出? 下面是我的代碼,請幫我理解int指針使用char指針進行類型轉換引發意外輸出?

#include<stdio.h> 
int main() 
{  
    int arr[3]={2,3,4}; 
    char*p; 
    p=(char*)arr; 
    printf("%d\n",*p); // here 2 its good 
    p=p+8; 
    printf("%d\n",*p);//here 4 why not 1? 
} 
+0

不......不考慮錯字,應該是4. – HuStmpHrrr 2014-09-19 17:12:09

+0

是應該是'int arr [3] = {2,3,4};'?你的例子中沒有'int *'。 – clcto 2014-09-19 17:13:52

+0

位不是字節。字符長度爲1個字節,而不是8個字節。 arr + 8位於陣列之外,因此可以打印任何內容或崩潰。 – 2014-09-19 17:20:03

回答

2

您的代碼會導致未定義的行爲。首先,我假設你的意思是:

char arr[3] = {2,3,4}; 

而不是你在那裏。那麼是的,你的第一個打印語句是正確的,並將輸出2.第二個,但任何事情都可能發生。你有一個3字節長的數組,現在你指向了8個字節,超過了它的起始地址。 任何東西可能在那裏,所以你的打印可以顯示任何輸出。

如果你有來代替:

int arr[3] = {2,3,4}; 

你的第二個輸出將顯示任一40,這取決於你是否分別具有little-或大端系統。假設你有一個4字節的int類型,即。

+0

讓我們把它是小端爲什麼4請解釋一下? – 2014-09-19 17:23:12

+0

@carrercarrer *爲什麼不能?*(int)2的長度是4個字節,因此向3.(int)3中添加p + 4個點是4個字節長,所以p + 8指向4個。這很明顯。 ..不明顯的是你爲什麼不這樣想。 – 2014-09-19 17:25:41

0

我想你的意思是這樣的:

char arr[3] = {2,3,4}; 

現在,p是char類型的指針,當你通過8遞增它所指向的是位於字符數組以外的一些無效 存儲位置(因爲你已經爲arr中的成員分配了3
的空間),這可能包含垃圾。
在這種情況下,輸出是不可預測的,因爲它可能是垃圾,或者您可能會得到有效的值
值。