2013-03-18 5 views
-1

我有一個u_char數組,它每次進入循環時都會改變,而一個成員的結構作爲u_char數組。我正在嘗試創建一個結構向量,其中包含u_char數組的所有迭代。但是,我得到一個段錯誤(當我使用memcpy)或相同的值重複(當我不)。幫幫我?下面的代碼u_char * memcpy segfault - 試過其他答案

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

'struct load'的定義是什麼? – 2013-03-18 14:30:29

+0

如果'l1.pload'是記錄的'u_char *',因此沒有備份的內存,那麼'memcpy(&l1.pload,...)'將segfault視爲'bytes'超過'sizeof(u_char *)',這就是4-8個字節,而'memcpy(l1.pload,..)'這就是你真正意思的段落錯誤,因爲它沒有指向任何地方。 – 2013-03-18 14:33:02

+1

在使用'memcpy()'之前,你需要確保爲'l1.pload'分配了足夠的內存。注意你可以使用'std :: vector ',因爲你已經在其他地方使用了'std :: vector',並且避免了任何顯式的動態內存管理。 – hmjd 2013-03-18 14:33:41

回答

0

你得到什麼史蒂夫 - O和hmjd在評論中表示,memcpy段故障:li.pload大概只是一個指針,並沒有指向它自己的任何空間,所以memcpy失敗。取決於您的編譯器,它是未初始化的,或指向0x0,並且在任何情況下,複製到該編譯器都會導致該錯誤。

li.pload只是一個指針。訣竅是,mem1應該每次都指向新的,有效的數據:

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

那麼你的for循環(這可以通過memcpy有代替)將正常工作,你可以保持您的l1.pload = mem1,因爲你每次都要存儲一個指向不同內存區域的指針。現在,每個li.pload都指向相同的內存區域,這就是爲什麼您在每條記錄中看到相同的值。

當然,由於您正在分配內存,因此在完成向量處理後,必須記得爲您的向量中的每個load刪除pload

+0

謝謝!我不相信我沒有意識到它只是需要一個'新'。謝謝! – ROARK 2013-03-18 14:49:56