我有这段代码
#include <iostream>
int *p=nullptr;
void sum(void)
{
*p=100;
}
int _tmain(int argc, _TCHAR* argv[])
{
sum();
std::cout<<*p<<std::endl;
return 0;
}
我收到错误“a.exe中0x009e140e处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。”
指针是全局的,如果所有子范围都不可见? 我不懂,因为我是初学者,这里发生了什么?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
您必须在访问之前分配内存。请执行以下操作:
void sum(void)
{
p = new int;
*p=100;
}
现在你必须在每次调用函数sum后释放内存; 所以在调用函数sum之后也这样做:
delete p;
答案 2 :(得分:0)
* P = 100;
不会使p
指向您的本地文字。它会尝试取消引用nullptr
并分配一个值,这会导致您注意到的异常。
要使p
指向本地文字,你应该有类似的东西
void sum() {
static const int literal = 100;
p = &literal;
}