[英]Assigning an int value to a pointer in C
根據本伯克利課程和本斯坦福課程,按如下所示將int
分配給pointer
應該會使我的程序崩潰:
#include<stdio.h>
int main() {
int *p;
*p = 5;
printf("p is %d\n", *p);
return 0;
}
但是,當我使用GCC {Apple LLVM版本5.0(clang-500.2.79)(基於LLVM 3.3svn)}在OSX 10.9.2上編譯時,我得到以下輸出:
Chris at iMac in ~/Source
$ ./a.out
p is 5
怎么會? 我看到有人問了相反的問題( 將值分配給c中的指針 ),但這只會使我進一步困惑,因為我的程序幾乎與該問題中發布的代碼相同。
您沒有將int
分配給pointer
。 如果p
是指針,則*p
指向其值。 您分配*p = 5;
這是普通整數到整數的賦值。
在這種情況下, p
未初始化,可能會導致分段錯誤。
我的回答:很幸運! 事實是,您恰巧在p中擁有的值是一個可以實際寫入的有效內存地址,這就是它起作用的原因...
嘗試在編譯器中使用優化選項(-O3),這樣會得到不同的結果...
您的程序不能保證失敗,也不保證可以成功。 您正在取消引用可以容納任何地址的指針。 這是不確定的行為。
根據本伯克利課程和本斯坦福課程,按照如下方式將int分配給指針應該會使我的程序崩潰:
首先,讓我們正確使用術語。 您不是在“將int
分配給指針”。 分配是創建存儲位置 。 一個int
是一個值 。 指針是一個值 。 可以取消引用 指針 。 取消引用有效指針的結果是產生一個存儲位置 。 取消引用無效指針的結果是不確定的,並且可以執行任何操作 。 可以將值分配給存儲位置 。
所以你有了:
int *p;
您已經分配了一個名為p
的(短期)存儲位置。 該存儲位置的值是一個指針。 由於您沒有將其初始化為有效的指針,因此其值為有效指針或無效指針。 哪有 這由您的編譯器決定。 它可能總是無效的。 它可能總是有效的。 否則可能會碰運氣。
然后您有:
*p = 5;
您取消引用了一個指針以產生一個存儲位置,然后在該存儲位置中插入了5。 祝賀您,如果它是有效的指針,則將5插入有效的存儲位置。 如果它是一個無效的指針,那么您將具有不確定的行為; 再次, 任何事情都可能發生 。
printf("p is %d\n", *p); // 5!
顯然您很幸運,這次是有效的存放地點。
根據本伯克利課程和本斯坦福課程[this],應該會使我的程序崩潰:
然后,這些課程是錯誤的,或者您是在錯誤引用或誤解它們。 該程序被允許做任何事情 。 允許發送邀請伊朗總統到您的電影之夜的電子郵件,允許打印任何內容,允許崩潰。 不需要做任何事情,因為“允許做任何事情”和“必須做某事”是相反的 。
不是它應該崩潰,而是未定義的行為。
根據系統和運行時環境的不同,分配給已取消引用和未初始化的指針可能會導致段錯誤或繼續“正常”運行,這意味着它似乎可以工作,但可能會產生異常的副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.