2015-07-03 48 views
-1

我有这样的代码全局指针当地文字:访问冲突

#include <iostream> 
int *p=nullptr; 

void sum(void) 
{ 
    *p=100; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    sum(); 
    std::cout<<*p<<std::endl; 
    return 0; 
} 

我得到的错误“在0x009e140e在A.EXE未处理的异常:0000005:访问冲突读取位置00000000”

指针是全局的,它应该对所有子范围都不可见吗? 我不明白,因为我是初学者,这里发生了什么?

+0

标题说明了一切...... :-P有从未被分配过了'p'任何空间。 –

+0

对不起,它不是一个变量,它的字面意思,我会纠正它。但问题仍然是 – MiceZeusDig

+3

“访问冲突”。 - 您正在写入无效的内存位置。代码是非常好的,你是在做一些非法的事情:写一个空指针。 –

回答

0

* P = 100;

不作p指向您当地文字。它试图取消引用nullptr并分配一个值,这会导致您注意到的异常。

为了p点到本地字面,你应该有这样的事情

void sum() { 
    static const int literal = 100; 
    p = &literal; 
} 
1

您必须先分配内存才能访问它。做如下:

void sum(void) 
{ 
    p = new int; 
    *p=100; 
} 

现在你必须每次调用函数sum后释放内存; 这样做也调用函数和后:

delete p; 
+0

现在你也必须解释如何避免每次你调用内存泄漏' sum'。 – GSerg

+0

为什么我需要堆上的变量?它不是巨大的..他们是一个字面范围的问题......为什么我不能在数据部分获取变量。问题是为什么?以及发生了什么..?使代码工作不是这里的目标 – MiceZeusDig

+0

@MiceZeusDig它不是关于堆和栈,而是关于指针和非指针。你可能只想'int p'而不是'int * p'。 – GSerg

3

指针是可见的。但它被设置为nullptr。你不能解除引用。

为了解决你可以写

int *p = new int(); 

void sum(void) 
{ 
    *p=100; 
} 

的问题,但更好的方法是以下

#include <memory> 

//... 

std::unique_ptr<int> p(new int()); 

void sum(void) 
{ 
    *p=100; 
}