2013-05-31 32 views
0

好吧,目前我正在編寫一個內核,爲了我的簡歷。在寫我的記憶管理單元時,我碰到了一堵磚牆。字符數組指針和從整數轉換(存儲器地址)

int address = (int)malloc(sizeof(Test)) 
consoleWriteString("Variable Address:\n"); 
consoleWriteInteger(address); 

char* f = (void*)address; 

consoleWriteString("\nVariable Address:\n"); 
consoleWriteInteger((int)&f); // Should print off the same as above 

邏輯上兩者的輸出應該是相同的。某處出了問題,但是。因爲我的輸出如下。

Variable Address: 47167 
Variable Address: 1065908 

經過長時間的測試和調試,我終於投入並決定要求堆棧溢出。另外,如果您發現任何語法錯誤,請忽略它們順便說一下,這全是在C中,並且所有函數都是自定義的,包括malloc,但是我已經確定錯誤不在於該函數或其他任何事實。我相信這只是我愚蠢的指針和投射,但當我錯過了超級簡單的事情時,不要嘲笑我。

感謝亞勒

+1

分配指向整數的指針並使用強制類型沉默你的叫喊編譯器?這是通向災難的道路。爲什麼不使用'void * address'或'char * address'?如果原因是沒有'consoleWritePointer',那就寫一個! – Jens

+0

感謝您的信息,對於一個consoleWritePointer我將如何繼續寫這個?只需將它轉換爲十六進制的地址,然後從那裏打印? – robbert229

+1

如果您已經有了一個符合標準C的printf,請使用'%p'說明符指針;如果不是,則將指針值轉換爲無符號整數值並打印(或使用聯合,粘貼到ptr中並讀取無符號值)。 – Jens

回答

2

&ff的地址,而不是其中包含的地址! f在堆棧上。它的值(你首先打印的地址)指向分配的內存。

想想這樣:你在內存中爲某些東西分配空間。這個內存區域有一個地址。你把這個地址放在一個指針(f)中,讓它指向那個區域。但f本身需要在內存中的某個地方,以保持該地址的價值。在這種情況下,f位於堆棧上,並且&f獲取地址f(原始地址的容器),而不是f包含的地址。

順便說一下,要非常小心地將地址轉換爲int(和back!),因爲int可能不足以容納地址(例如,在x86-64上,具體取決於您的編譯器)。我相信當你想使用一個地址作爲一個整數時使用的正確類型是uintptr_t in stdint.h

+0

關於地址大小和int大小的好建議! – Floris

+0

感謝您提供的有用和快速的響應,以及有關使用整數來保存地址值的警告。 – robbert229

+0

@robbert:沒問題:-) – Cameron

1

值f(這恰好是一個指針)的相同address(這也是一個指針,但不同類型的) - 這是你在做什麼線

char* f = (void*)address; 

但你打印地址的F

consoleWriteInteger((int)&f); 

這是不是同樣的事情值f ...更改線路

consoleWriteInteger((int)f); 

,你應該準備就緒。

0

第一次打印輸出是一個int,儘管malloc返回一個地址,第二個是輸出到int的地址。做f而不是&得到你的值的地址,而*取消引用一個指針,讓你指向正在指向的值。

+0

爲什麼downvote這個 – aaronman

+0

OP沒有要求什麼被指向的值,而是地址。因此「使用'* f'」是錯誤的建議。 「使用f而不是'&f'」是正確的建議,正如其他兩個答案中所解釋的那樣。 – Floris

+0

@弗洛伊斯我改變了它,但我不知道爲什麼它很重要,因爲關於OP的一切都是不正確的,如果他不明白malloc如何工作,不知道他爲什麼要編寫內核 – aaronman