2010-12-01 103 views
3

當我在gcc編譯器(www.codepad.org)上運行上述程序時,我得到輸出爲 不允許的系統調用:SYS_socketcall 任何人都可以請清楚爲什麼這個錯誤/輸出來了嗎?指針分配問題

int main() { 
    int i=8; 
    int *p=&i; 
    printf("\n%d",*p); 
    *++p=2; 
    printf("\n%d",i); 
    printf("\n%d",*p); 
    printf("\n%d",*(&i+1)); 
    return 0; 
} 

我觀察到的是我執行後變得無法訪問* ++ p = 2;爲什麼?

回答

5

當你做*p = &i,你讓p指向單個整數i++p遞增p指向「下一個」整數,但由於i不是數組,因此結果未定義。

+0

正確的解釋。謝謝。 – hari 2010-12-01 18:47:49

2

你正在觀察的是未定義的行爲。具體而言,*++p=2中的提領p被禁止,因爲i不是具有至少兩個成員的數組。在實踐中,您的程序很可能試圖寫入&i + sizeof(int)解決的任何內存。

1

您正在調用未定義的行爲通過寫入堆棧上的未定義區域。 codepad.org可以防止試圖執行不允許的事情的程序,並且您的未定義的行爲程序似乎觸發了這一點。

如果您嘗試在自己的計算機上執行此操作,程序可能會以其他方式(例如分段故障或總線錯誤)崩潰。

1

表達*++p首先移動指針p指向一個int向前(即,指針變爲無效),則取消引用所得指針和試圖保存數字2那裏,從而寫入無效的內存。

你可能意思是*p = 2(*p)++

+0

以下代碼正常運行。 int main(){ int i = 8; int * p =&i; printf(「\ n%d」,* p); * ++ p = 2; // printf(「\ n%d」,i); printf(「\ n%d」,* p); // printf的( 「\ n%d」,*(&i+1)); 返回0; } 這意味着問題是NT由於* ++ p值= 2.Though我已訪問未分配存儲器,其NT的問題。在* ++ p = 2 p指向某個值爲2的位置;但是混淆的是它沒有指出i.SO的值爲什麼我變得不可訪問? – sudhansu 2010-12-02 04:43:59

0

你的代碼訪問它不擁有的內存,並且結果是未定義的。

所有的代碼具有&p做,因爲它是目前寫的權利是在閱讀和&i從大小sizeof(int)的面積寫入內存,和另一大小sizeof(int*)的。

以下行全部違反了​​這些約束,通過使用超出允許讀取或寫入數據範圍的內存地址。

*++p=2; 

printf("\n%d",*p); 
printf("\n%d",*(&i+1)); 
0

++修改其參數,所以該線*++p=2;分配2到大概定義call frame增量指針p堆棧上的位置。一旦你搞砸了投注框架 - 所有投注都關閉 - 你最終會陷入腐敗狀態。