-1

ループに入るたびに変化する u_char 配列と、u_char 配列としてメンバーを持つ構造体があります。u_char 配列のすべての反復を含む構造のベクトルを作成しようとしています。しかし、セグメンテーション違反 (memcpy を使用する場合) または同じ値が複製される (使用しない場合) のいずれかが発生します。ヘルプ?これがコードです

u_char * data; //contains the data I want to copy from each iteration
unsigned char mem1[bytes];
for(int i=0; i<bytes; i++) {
    mem1[i] = data[i];
}
struct load l1; //contains one member (pload of type u_char*)
l1.pload = mem1; //this gives me the same value in all elements of the vector
//I also tried using memcpy, like this:
//memcpy(&l1.pload, mem1, bytes); //this gave me a segfault 
recd.push_back(l1) //recd is a std::vector<load>  

私はそれを次のように印刷します:

for(std::vector<load>::iterator it1 = recd.begin(); it1 != recd.end(); ++it1) {
     cout<<"\nhere\n"<<endl;
     cout<<it1->pload<<endl;
} 
4

1 に答える 1

0

memcpySteve-oとhmjdがコメントで言ったことについて、セグメンテーション違反が発生します。li.ploadこれはおそらく単なるポインタであり、それ自体のスペースを指していないため、memcpy失敗します。コンパイラによっては、初期化されていないか、0x0を指している場合があります。いずれの場合も、コンパイラにコピーすると、エラーが適切に発生します。

li.pload単なるポインタであってもかまいません。秘訣は、mem1毎回新しい有効なデータを指す必要があることです。

`u_char * mem1 = new u_char[bytes];`

そうすれば、forループ(そこで置き換えることができますmemcpy)は正常に機能し、l1.pload = mem1毎回異なるメモリ領域へのポインタを格納するため、を保持できます。現在のように、それぞれli.ploadが同じメモリ領域を指しているため、各レコードに同じ値が表示されます。

もちろん、メモリを割り当てているので、ベクターを使い終わったら、ベクター内ploadのそれぞれを削除することを忘れないloadでください。

于 2013-03-18T14:39:47.370 に答える