0

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;
}

为什么即使我没有为它分配局部变量的地址也会出现访问冲突......

是的,我可以使用vectoror pass by reference

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

4

5 回答 5

4

因为它是在set_data(). 通过引用传递指针,以便调用者可以看到更改:

void set_data(void*& pBuff)

请注意,函数变量pBuff隐藏了函数中的全局pBuff变量set_data()

也就是说,我不确定void*为什么vector<int>不使用它为您处理所有动态内存分配的原因和原因。

于 2012-11-15T17:12:01.590 回答
3

当你说

pBuff = phy_bn;

您只是在更改 的局部值pBuff,而不是 的全局值pBuffpBuff要么作为双指针传递,要么简单地删除函数的参数,就像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;
    ...
}
于 2012-11-15T17:12:11.790 回答
2

'请我想避免双指针..它不需要我猜......'

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

void set_data(void*& pBuff)
{
    // ...
}

这实际上与使用双指针相同。

你唯一要做的事

pBuff =phy_bn; 

正在操作本地堆栈上的函数参数表示。

于 2012-11-15T17:15:24.123 回答
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;
}

Theny确实会更新,因为您已明确要求将其作为您传递给的名称x别名set(),而不是副本。您被名称误导了:pBufinset_data()不是 in 中的同一个变量pBufmain()即使它们碰巧具有相同的值;他们就像两个不同的人,有着相同的名字和相同的金额。

于 2012-11-15T17:26:37.543 回答
0

内部不是全局pBuff的。全局的值永远不会从 0 改变。由于这是 C++ 代码,可以通过引用获取它的指针参数,并且分配给它会改变函数调用点的值。set_datapBuffpBuffset_data

于 2012-11-15T17:12:48.623 回答