簡體   English   中英

在C中為一個指針分配一個int值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM