0

その構造体への二重ポインターを指定して、データを構造体メンバーにコピーしたいと考えています。の署名を変更できませんcopyFoo()。メンバ cnt にはGetCnt()期待どおりの戻り値が割り当てられますが、memcpyこのように使用するとアクセス違反が発生します。構造体への二重ポインターと void ポインター メンバーがある場合に memcpy を使用する方法を詳しく説明してもらえますか? どうもありがとうございました!

struct mystruct
{
    void * data;
    unsigned int cnt;

};

void copyFoo( myObj * inBar, mystruct **outFoo)
{
  memcpy((*outFoo)->data, inBar->GetData(), inBar->GetLength() );
  (*outFoo)->cnt=  inBar->GetCnt();
}

int main(void){

myObj *in = getObj();
mystruct *out= new mystruct;
copyFoo(in, &out));
delete in;
delete out;

}

のmemberfunctionGetData()inbarvoid ポインターをGetCnt()返しunsigned int、 をGetLength()返し、 を返しますint

4

1 に答える 1

1

データをコピーする前に、適切なサイズのメモリ ブロックを割り当てる必要があります。

void copyFoo(myObj *inBar, mystruct **outFoo)
{
    (*outFoo)->data = malloc(inBar->GetLength());                     // <-- THIS
    memcpy((*outFoo)->data, inBar->GetData(), inBar->GetLength());
    (*outFoo)->cnt=  inBar->GetCnt();
}

dataメンバーがmystructまだ初期化されていないか、既に解放されているメモリを指している場合、関数は未定義の動作copyFooを呼び出します。

于 2013-10-01T16:27:08.077 に答える