2010-09-01 170 views
1

我對這個程序有一個困惑。指針可以作爲變量嗎?

#include <stdio.h> 

int main(void) 
{ 
     int value = 10; 
     char ch = 'A'; 

     int* ptrValue = &value; 
     char* ptrCh = &ch; 

     int* ptrValue1 = value; 
     char* ptrCh1 = ch; 

     printf("Value of ptrValue = %d and value of ptrValue1 = %d\n", *ptrValue, ptrValue1); 

     printf("Value of ptrCh = %c and value of ptrCh1 = %c\n", *ptrCh, *ptrCh1); 
} 

我得到兩次警告,同時編制這個方案

的UniPro @ ubuguest:/ SoftDev/ADSD /模塊 1 /單位1 /路/ C /系統$ CC charPointers.c -o charPointers
charPointers.c:在功能 '主':
charPointers.c:11: 警告:初始化使指針 從整數,未作鑄造
charPointers.c:12:警告: 初始化使指針從 整數沒有鑄造

我知道他們的意思。

運行程序時出現以下錯誤。

UniPro中@ ubuguest:/ SoftDev/ADSD /模塊 1 /單元1/RD/C /系統ptrValue = 10的$ ./charPointers
價值和ptrValue1 = 10
分段故障

的值

我知道我得到第二個printf方法的錯誤。

所以我的問題是如果我在指針中存儲一個值,爲什麼我們不能去引用它呢?它的行爲像一個變量?

謝謝。

+1

指針是存儲地址的變量。 – Nyan 2010-09-01 08:40:34

+0

感謝您的回覆 – Searock 2010-09-01 09:45:52

+1

如果您使用gcc和-Wall進行編譯,它會告訴您第一個printf調用的一個參數對於所使用的格式說明符而言類型錯誤,這意味着您基本上將一個指針轉換爲int取消引用指針,這使得它看起來像你似乎認爲第二個printf行失敗了。 – nategoose 2010-09-01 19:47:21

回答

5

隨着分配

char* ptrCh1 = ch; 

您將設置地址的0x41,而不是價值。該程序稍後將嘗試解除引用0x41(即,在地址0x41處獲取數據),這是非法地址。因此,分段錯誤

0

這是因爲*ptrCh1在最後一行,您試圖對其進行解引用。刪除*使其工作(但它不是很有意義,但)。

1

您可以對其進行解除引用,但獲得有效內存塊的機會非常渺茫。此處有效意味着您的流程擁有該位置的訪問權限。

操作系統將阻止您修改不屬於您的進程的內存。它通過分段錯誤「異常」來響應那種無效的內存訪問。

1

指針指向一個內存位置(然後您可以在其中存儲一些值)。這裏

int* ptrValue1 = value; 
    char* ptrCh1 = ch; 

您指定一個指針變量的值(不是其地址),使指針很有可能指向一個無效的內存位置,因此段錯誤。請注意,在許多體系結構中,有效內存位置始於高偏移量,因此像10或('ASCII'值)'A'這樣的小整數值永遠不會指向有效的內存位置。這種低內存位置通常由操作系統本身保留/使用(因此它們不受修改 - 如果您嘗試,會出現段錯誤)。如果您嘗試直接訪問另一個進程使用的內存,通常會發生同樣的情況。

0

當然,它必須segfault。你正在存儲指針中的任何值(並且正如你所說的編譯器警告過你的那樣),然後你將它解除引用,無論這指向何處。 你還期望什麼?

2

一個指針存儲的東西(或NULL)的地址。因此int *可以存儲int的地址。您可以使用一元運算符&獲得某個地址。

那麼,將10存儲在int指針中意味着什麼?那麼,10不是int的地址,所以你得到了「初始化使得整型指針沒有拋出」警告,並且由於你在int *中存儲了除int以外的其他地址,並嘗試對其進行解引用,你會得到未定義的行爲。

在你的情況中可能發生的事情是10個被解釋爲內存地址,並且當你取消引用一個指針時,它將出去獲取該地址處的任何內容(在你的情況下爲內存地址10)。這裏可能什麼也沒有,那個內存區域沒有被映射,並且你是segfault。

相關問題