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

ローカル変数のアドレスを割り当てていないのに、なぜそのアクセス違反が発生するのか...

はいvector、またはを使用できますpass by reference

しかし、なぜpBuffが割り当てられないのか知りたい

4

5 に答える 5

4

これは、内で変更されているポインタのコピーset_data()であるためです。変更が呼び出し元に表示されるように、参照によってポインターを渡します。

void set_data(void*& pBuff)

関数変数は、関数内pBuffのグローバル変数を非表示にすることに注意してください。pBuffset_data()

とはいえ、すべての動的メモリ割り当てを処理する理由と使用されていないvoid*理由はわかりません。vector<int>

于 2012-11-15T17:12:01.590 に答える
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;
    ...
}
于 2012-11-15T17:12:11.790 に答える
2

「plz私は二重ポインタを避けたいです..それは必要ではないと思います...」

間違っていると思います、それ必要です!pBuff次に、パラメータのポインタ参照が必要になります。

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

これは、実質的にダブルポインタを使用するのと同じです。

あなたがしている唯一のこと

pBuff =phy_bn; 

ローカルスタック上の関数パラメータ表現を操作しています。

于 2012-11-15T17:15:24.123 に答える
0

pBuff内部set_dataはグローバルではありませんpBuff。グローバルの値がpBuff0から変更されることはありません。これはC++コードであるset_dataため、参照によってポインター引数を取ることができ、それに割り当てると、関数呼び出しの時点で値が変更されます。

于 2012-11-15T17:12:48.623 に答える
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 yset()set()

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

次に、コピーではなく、渡す名前のエイリアスyであることを明示的に要求したため、実際に更新されます。名前に惑わされました。inは、たまたま同じ値を持っていても、inは同じ変数ではありません。彼らは同じ名前で同じ金額の2人の異なる人のようなものです。xset()pBufset_data()pBufmain()

于 2012-11-15T17:26:37.543 に答える