2010-07-27 66 views

回答

1

由於任何位置0顯然都與機器相關,所以您可以自由使用任何與機器相關的技巧。閱讀供應商的文檔。很可能,如果您訪問位置0對您來說完全有意義,系統將設置爲使其合理地輕鬆完成此操作。一些可能性是:

只需將一個指針設置爲0.(這是不需要工作的方式,但如果它有意義的話,它可能會發生)。 將整數0賦值給一個int變量,並將其轉換int指向一個指針。 (這也不能保證工作,但它可能會吧。) 使用聯合的指針變量的位設置爲0:

union { 
    int u_p; 
    int u_i; /assumes sizeof(int) >= sizeof(int *) */ 
} p; 

p.u_i = 0; 

使用memset的一個指針變量的位設置爲0:

memset((void *)&p, 0, sizeof(p)); 

聲明一個外部變量或數組

extern int location0; 

並使用匯編語言文件,或一些特殊的連接器調用,來安排這個符號是指(ⅰ。即變量被放置在)地址0.

+0

您應該使用'unsigned'而不是'int'。另外,假設用戶程序在讀取地址零時不會產生內存錯誤。 – 2010-07-27 21:26:01

+1

這就是問題的假設。 – aib 2010-07-27 21:27:09

2

根據你的C實現,你是正確的,內部空指針可能不是0.但通常是。如果您想要非常安全,則可以鍵入值,或使用memset()

uintptr_t zerobits = 0; 
void *pointer1 = (void *)zerobits; 

或:

void *pointer2; 
memset(&pointer2, 0, sizeof pointer2); 
+0

在我使用的大多數(嵌入式)機器類型中,內存地址0是完全有效的,與空指針地址不同。 C標準要求將數字0轉換爲內部空指針地址,這使得大部分代碼都是可移植的。 – nmichaels 2010-07-27 22:23:19

+0

@Nathon,我有相反的經歷 - 0幾乎總是一個有效的指針和空指針地址。 – 2010-07-27 23:28:28

+0

這怎麼可能?當存儲器地址被訪問或者不存在時,機器觸發中斷。C保證它將地址0(在編譯時)轉換爲空指針地址的機器表示。 – nmichaels 2010-07-28 11:46:42

2

如果你在哪裏,你需要閱讀的零地址/寫矢量(?我想你是在某種嵌入式系統)域工作,那麼你會發現你所做的很多事情將不在「C」標準的一般直接中間解釋之外。

您可以非常安全地假設嵌入式編譯器會生成對放入指針的地址的訪問,而不會奇蹟般地更改其內容。

但是,您不能始終假定數據表中的物理地址零是處理器在讀取/寫入地址零時訪問的內容。如果處理器中有MMU,那麼您可能需要經過某種邏輯 - >物理映射過程,即使沒有完整的MMU,許多現代小型嵌入式處理器也會在中斷周圍使用地址空間進行遊戲矢量(例如,從閃存引導,然後可選地將該部分地址空間重新映射到RAM)。