指向本地文字的全局指针:访问冲突

时间:2015-07-03 19:31:24

标签: c++

我有这段代码

#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。”

指针是全局的,如果所有子范围都不可见? 我不懂,因为我是初学者,这里发生了什么?

3 个答案:

答案 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;
}
相关问题