我在下面的代码中遇到access violation
错误。我已经在程序中指出了它。
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;
}
为什么即使在我没有为其分配本地变量的地址时也存在访问冲突...
是的,我可以使用vector
或pass by reference
。
但我想知道为什么pBuff没有被分配
答案 0 :(得分:4)
因为它是set_data()
内修改指针的副本。通过引用传递指针,以便调用者可以看到更改:
void set_data(void*& pBuff)
请注意,函数变量pBuff
隐藏了函数pBuff
中的全局变量set_data()
。
那就是说,我不确定void*
的原因以及为什么没有使用vector<int>
来处理所有动态内存分配。
答案 1 :(得分:3)
当你说
时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;
...
}
答案 2 :(得分:2)
'PLZ我想避免双指点..我猜不是必需的......'
猜错了, 是必需的!您需要pBuff
参数的指针引用,然后:
void set_data(void*& pBuff)
{
// ...
}
这实际上与使用双指针相同。
你唯一能做的事情
pBuff =phy_bn;
正在操作本地堆栈上的函数参数表示。
答案 3 :(得分:0)
pBuff
内的set_data
不是全球pBuff
。全局pBuff
的值永远不会从0更改。由于这是C ++代码,set_data
可以通过引用获取其指针参数,并且分配给它将更改函数调用时的值
答案 4 :(得分:0)
在C ++中,指针按值传递,与其他值类型相同。将指针视为字面上的整数类型可能是指导性的;然后很容易看出为什么pBuff = phy_bn;
没有完成任何事情,原因与此代码不相同:
#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;
}
这里,x
是一个局部变量。它是y
的副本,不是 y
本身。您可以通过赋值来更改其值,当然,您只需要更改在set()
范围之外不存在的变量的值。如果您更改set()
的定义以使用引用:
void set(int& x) {
x = 5;
}
然后y
确实会更新,因为您明确要求将x
作为别名作为传递给set()
的名称,而不是复制。您被名称误导了:pBuf
中的set_data()
与pBuf
中的变量main()
不同,即使它们碰巧具有相同的值;他们就像两个不同的人,名字相同,金额相同。