为什么这种访问违规

时间:2012-11-15 17:09:36

标签: c++ pointers

我在下面的代码中遇到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;
}

为什么即使在我没有为其分配本地变量的地址时也存在访问冲突...

是的,我可以使用vectorpass by reference

但我想知道为什么pBuff没有被分配

5 个答案:

答案 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()不同,即使它们碰巧具有相同的值;他们就像两个不同的人,名字相同,金额相同。