2011-06-13 117 views
4

我已經查看了這裏和其他地方的各種問題,但我仍然無法解釋我得到的訪問衝突錯誤。 「訪問衝突寫入位置0x00000000」對應於一個NULL指針,是否正確?我已經聲明瞭一個int指針,然後我嘗試在該位置設置一個值。當我聲明指針時,不應該分配內存空間嗎?原諒我,如果這是不好的,但我更像一個Java/AS3的傢伙。C++訪問衝突寫入位置0x0 ...設置int *

這裏是我的代碼的一部分...

int* input; 
char* userInput[1]; 
int* output; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    while(1) 
    { 
     srand(time(0)); 
     *input = (int)(rand() % 10); 

它打破在最後一行。

回答

10

對於指針,內存分配爲,但指針本身仍然不指向任何位置。使用new爲要指向的指針分配內存,稍後使用delete釋放內存。

2

您聲明瞭一個指針但它從未分配過指向它的內存。全局指針變量被初始化爲零,所以你很幸運,在棧上你會得到未定義的行爲。

input = new int解除引用。

+1

全局變量默認初始化。對於原始類型,這恰好設置爲零,但會調用構造函數,並且對於任何更復雜的東西都是這樣。 2011-06-13 05:14:00

+0

那麼,解引用空指針也是* undefined behavior *,雖然它比野指針更易於檢測。 – 2011-06-13 05:14:32

+0

@Billy:靜態生命期的變量在執行開始之前首先被初始化爲零。之後,構造函數運行。 – 2011-06-13 05:15:18

1

編號int* input;僅聲明一個指向int的指針,而不是保存整數所需的實際空間。

1

否。內存空間永遠不會分配給指針。你必須自己分配。 (如果你使用的是C++,你應該幾乎總是使用智能指針而不是原始指針)

1

指針本身的內存被保留(足以容納一個地址),但沒有任何內存指向的指針。

隨着Java的背景,你會認識到這與NullReferenceException類似。

0

你真的需要指針嗎?如果你只是需要一些int S和一個字符串,可以直接對其進行分配:

int input; 
int output; 
std::string userInput; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    while(1) 
    { 
     srand(time(0)); 
     input = rand() % 10; 
0

「不應該當我宣佈指針的內存空間分配」 - 對堆內存只有當您使用分配新的關鍵字。 例如,

int *ptr //creates a pointer variable on the stack 
ptr = new int(5); //allocates space in heap and stores 5 in that space 

希望這可以幫助你!