1

固定サイズの整数要素の配列へのポインターがあります。その配列にデータを入力した後、それを void *pBuff に割り当てました。後で、void ポインターを介して配列要素にアクセスする必要がありますが、失敗しました。

Cを使用したコードは次のとおりです。

void * pBuff = NULL;

int
set_data(void *pBuff)
{
    int ptr = 10, i;
    int phy_bn[8] = {0};
    int (*pPB)[8];

    for(i=0; i<8; i++){
        phy_bn[i] = ptr;
    }

    pPB = &phy_bn;
    pBuff = pPB;

    return 0;
}


int main()
{
    int i;

    set_data(&pBuff);

    for(i =0 ; i <8; i++){
         printf("\ndata : %d\n", *(int *)pBuff[i]);
    }
    return 0;
}

*(int *)pBuff[i] に対して、'void' 項を非 'void' にキャストするエラーが発生します。

どんな助けでも本当に感謝します。

ありがとう、

-サム

4

4 に答える 4

3

あなたが使用する必要があるという事実とは別に:

((int*)pBuff)[i]

コードにあるのはUndefined Behaviorです。

pBuff = pPB;

pBuff関数にローカルな配列を指し、その有効期間は関数のスコープ外には存在しません。したがって、存在する必要はないが、時々存在するように見える何かを指すポインターがあります。

于 2012-11-15T06:25:26.173 に答える
2

おそらく*or[]で逆参照する必要があります。同時に両方ではありません:-)

siを指す void ポインターの位置で整数を取得することが目的の場合は、次を使用します。int

((int*)pBuff)[i]

は整数へのポインタに((int*)pBuff)変わり、次はその位置で 'th 整数を取得します。pBuff[i]i

したがって、ループは次のようになります。

for (i = 0 ; i < 8; i++)
     printf ("\ndata : %d\n", ((int*)pBuff)[i]);

おそらく注意すべきもう 1 つのことは、スタックベースの変数へのポインターを返すことです。これらの変数は、関数が終了すると消えます。その時点でそれらへのポインターを逆参照することは未定義の動作です。

于 2012-11-15T06:20:33.917 に答える
1

pBuff[i]は であるため、違法pBuffですvoid*。それは演算子の優先順位の問題です:

((int *)pBuff)[i]

すでにそれを行っているためpBuff、最初のもので再度逆参照する必要はありません。*[i]

于 2012-11-15T06:20:10.767 に答える
0

そのはず

void * pBuff = NULL;

int
set_data(void *pBuff)
{
    int ptr = 10, i;
    int *phy_bn = (int*)malloc(sizeof(int)*8);
    //this is needed so that it is valid for pBuff to point phy_bn even if it is getting out of scope

    for(i=0; i<8; i++){
        phy_bn[i] = ptr;
    }

    pBuff = phy_bn;

    return 0;
}


int main()
{
    int i;

    set_data(&pBuff);

    for(i =0 ; i <8; i++){
         printf("\ndata : %d\n", ((int*)pBuff)[i]);
    }
    return 0;
}
于 2012-11-15T06:24:02.827 に答える