2011-06-13 114 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 

希望这可以帮助你!