Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向本地文字的全局指针:访问冲突_C++ - Fatal编程技术网

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

C++ 指向本地文字的全局指针:访问冲突,c++,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; } #包括 int*p=nullptr; 无效金额(作废) { *p=100; } int _tmain(int argc

我有这个密码

#include <iostream>
int *p=nullptr;

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

int _tmain(int argc, _TCHAR* argv[])
{
    sum();
    std::cout<<*p<<std::endl;
    return 0;
}
#包括
int*p=nullptr;
无效金额(作废)
{
*p=100;
}
int _tmain(int argc,_TCHAR*argv[]
{
sum();

std::cout在访问内存之前,必须先分配内存。请执行以下操作:

void sum(void)
{
    p = new int;
    *p=100;
}
现在,每次调用sum函数后都必须释放内存; 因此,在调用函数sum后也要这样做:

delete p;

指针可见。但它已设置为nullptr。您不能取消引用它

要解决这个问题,你可以写

int *p = new int();

void sum(void)
{
    *p=100;
}
但更好的方法是

#include <memory>

//...

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

void sum(void)
{
    *p=100;
}
#包括
//...
std::unique_ptr p(new int());
无效金额(作废)
{
*p=100;
}
*p=100

不使
p
指向您的本地文字。它尝试取消引用
nullptr
并指定一个值,这会导致您注意到的异常

要使
p
指向一个本地文本,您应该有如下内容

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

标题说明了一切:-P…从来没有为
P
分配过任何空间。很抱歉,这不是变量,而是文本,我会更正它。但问题仍然是
访问冲突
-您正在写入无效的内存位置。代码很好,是您在做非法的事情:写入空指针。为什么e投票反对的人?(S)他是一个初学提问的人。请不要对此投反对票。@MiceZeusDig很可能是因为缺乏研究和调试工作。现在你还必须解释如何避免每次调用
sum
时出现内存泄漏。为什么我需要堆上的变量?它不是很大。它们不是一个文本范围的问题……为什么我不能得到数据段上的变量。问题是为什么?发生了什么..?使代码工作不是目标here@MiceZeusDig这不是堆与堆栈的关系,而是指针与非指针的关系。您可能只是想要
int p
而不是
int*p
。您只是声明了一个指针p,但它没有指向任何地方如果使用运算符new初始化,当您将100分配给
p
时,您告诉它引用100的内存位置,这可能是不允许的,因此会出现错误。