C++ 为什么会出现这种访问冲突

C++ 为什么会出现这种访问冲突,c++,pointers,C++,Pointers,我在下面的代码中得到了访问冲突错误..我已经在程序中指出了它 void *pBuff = 0; void set_data(void *pBuff) { int value = 70, i; int *phy_bn = new int[8]; for(i=0; i<8; i++)phy_bn[i] = value; pBuff =phy_bn; cout<<((int*)pBuff)[0];//..accessing 0th ele

我在下面的代码中得到了
访问冲突
错误..我已经在程序中指出了它

void *pBuff = 0;

void set_data(void *pBuff)
{
    int value = 70, i;
    int *phy_bn = new int[8];

    for(i=0; i<8; i++)phy_bn[i] = value;

    pBuff =phy_bn;
    cout<<((int*)pBuff)[0];//..accessing 0th element value..no error here..gives 70 as result..
}


int main()
{
    set_data(pBuff);
    cout<<((int*)pBuff)[0];//acces violation error
    return 0;
}
void*pBuff=0;
void set_数据(void*pBuff)
{
int值=70,i;
int*phy_bn=新int[8];
对于(i=0;i,因为它是在
set_data()
中修改的指针的副本。通过引用传递指针,以便调用者可以看到更改:

void set_data(void*& pBuff)
请注意,函数变量
pBuff
在函数
set_data()
中隐藏全局变量
pBuff

也就是说,我不确定
void*
的原因以及为什么没有使用
vector
来为您处理所有动态内存分配。

当您说

pBuff = phy_bn;
您只是更改了
pBuff
的局部值,而不是
pBuff
的全局值。请将
pBuff
作为双指针传递,或者简单地删除函数的参数,因为
pBuff
已经是全局的

void *pBuff = 0; /* This is the global pBuff, which isn't being changed */

void set_data(void *pBuff /* This is the local pBuff, which is being changed */)
{
    ...
    pBuff = phy_bn;
    ...
}

<代码> pBuff内>代码> SETIODATABAS/<代码>不是全局代码> pBuff。全局代码> pBuff永远不会从0改变。因为这是C++代码,SETXDATA < /COD>可以引用它的指针参数,并且分配给它将改变函数调用点的值。o避免使用双指针..我想这不是必需的..”

猜错了,必需的!您需要为
pBuff
参数提供指针引用,然后:

void set_data(void*& pBuff)
{
    // ...
}
这实际上与使用双指针相同

你唯一要做的事

pBuff =phy_bn; 

是在本地堆栈上操作函数参数表示。C++中的“/P>>P>”指针通过值传递,与其他值类型相同。将指针看作字面上的整数类型可能是有指导意义的,那么很容易看出为什么“代码> pBuff= PyAsBN;< /C>”不能实现任何目标,原因与此相同。e没有:

#include <iostream>

void set(int x) {
    x = 5;
}

int main(int argc, char** argv) {
    int y = 0;
    set(y);
    std::cout << y << '\n';
    return 0;
}

然后
y
确实会被更新,因为您明确要求将
x
作为传递给
set()
的名称的别名,而不是副本。您被名称误导了:
set_data()
中的
pBuf
main()中的
pBuf
不是同一个变量
,即使它们碰巧具有相同的值,但它们就像两个不同的人,拥有相同的姓名和相同的金额。

如果希望能够通过参数传递新创建的缓冲区,则必须传递指针引用或双指针。这就是语言的工作方式!传递y我们的指针是通过引用而不是通过值。例如,
void set\u数据(void*&pBuff)
@Rook,@WhozCraig注意,
pBuff
已经是全局的了。这不一定是最好的方法,但他们在当前的设置中不需要双指针。@Xymostech确实如此,这就是为什么我限定了我的语句并特别提到了参数;-)“我想避免双指针..我想这不是必需的…”-如果要通过引用传递指针,则必须使用双指针或指针引用。是否应该这样做(以及是否应该使用全局变量、手动内存管理和非类型指针)这是一个完全不同的问题。我想澄清我的概念。是的,我可以使用向量或通过引用传递。但我想知道为什么pBuff没有得到分配。我想澄清我的概念。是的,我可以使用向量或通过引用传递。但我想知道为什么pBuff没有得到分配。我想澄清我的概念。是的,我可以使用vector或通过引用传递..但我想知道为什么pBuff没有得到assigned@cSharper因为您既有本地版本又有全局版本,所以您仅在执行作业时更改本地版本。@cSharper,因为您不是通过引用传递!如果您的真正意思是“为什么
pBuff
的全局定义不是assi”gned'这个答案确实解释得最好。全局
pBuff
定义被同名的函数参数所遮蔽。@cSharper它是最后一个包含其他答案中所有信息的参数;o)。。。
void set(int& x) {
    x = 5;
}