2013-06-02 145 views
-1

我一直試圖弄清楚這幾個小時,一直讓我有點瘋狂。 我在執行程序時不斷收到分段錯誤,我該如何解決這個問題? 我也得到一個警告「試圖從不同大小的整數指針」,但當我使用 鑄造(int *)我仍然得到警告。幫助請... 下面的代碼:訪問內存地址的內容C


int address, length, i; 
int * p = malloc(sizeof(int)); 

printf("Please enter <address> <length>\n"); 
scanf("%x %d", &address, &length); 
p = (int *) address; 

for (i=0; i<length;i++){ 
printf("%02x ", p[i]); 
} 
+0

試圖修復*什麼*? –

+0

你想解決哪個有用的問題? – Sebivor

+0

投票結束,嘗試重新措詞作爲一個問題。 –

回答

0

使用

p = &address;memcpy(p,&address,sizeof(int))instead of p = (int *) address;

此外,如果長度大於1,則有可能是分段錯誤在

for (i=0; i<length;i++){ 
printf("%02x ", p[i]); 
} 
+0

謝謝,但我需要訪問由「地址」中的值表示的內存位置。如果我使用p =&address只能給我「address」的內存位置而不是它的值。 – user2445182

+0

也許你應該多讀一點關於虛擬內存......和操作系統......和安全......和C編程......並且在十年的時間裏再次嘗試一次,一旦你解決了一些有用的問題使用C. – Sebivor

+0

確保地址具有讀取寫入權限 – akhil

1

這應該「工作「 - 當然,你仍然必須輸入一個有效的地址,否則代碼會崩潰因爲你試圖從一個你無法讀取的地址讀取 - 你無能爲力,因爲沒有辦法重寫操作系統中處理「你試圖讀取不存在或不存在的內存」的部分,不屬於你「。

uintptr_t address; 
int length, i; 
int *p; 

// No need to malloc here. malloc(sizeof(int)); 

printf("Please enter <address> <length>\n"); 
scanf("%" PRIxPTR " %d", &address, &length); 
p = (int *) address; 

for (i=0; i<length;i++){ 
printf("%02x ", p[i]); 
} 
+0

值得注意的是,即使這個*有*工作,它似乎嚴重依賴於巧合而非邏輯。不是所有的段錯誤都是由*「你試圖讀取不存在或不屬於你的內存」引起的*;輸入的地址可能指向進程擁有的已分配內存,但不適合指向「int」。 +1用於'uintptr_t'。 – Sebivor

+0

根據處理器的不同,它也可能會導致「總線錯誤」,這是「未對齊訪問」的另一個詞,是的。通常情況下,這與Segault的處理方式不同,但是,是的,完全可以輸入導致其他錯誤的值,而不是「不能讀取此內存,因爲它不存在」。如果地址在x86上是非規範的(也就是說,該字中48和63之間未使用的高位與47位不相同),則不確定會出現什麼錯誤。 –