u_char * memcpy segfault - 尝试了其他答案

时间:2013-03-18 14:28:55

标签: c++ segmentation-fault memcpy

我有一个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;
} 

1 个答案:

答案 0 :(得分:0)

你在memcpy中得到了Steve-o和hmjd在评论中所说的分段错误:li.pload可能只是一个指针,它并没有指向它自己的任何空间,所以{ {1}}失败。根据您的编译器,它是未初始化的,或指向0x0,在任何一种情况下,复制到该应该正确地导致该错误。

memcpy可以成为一个指针。诀窍是,li.pload每次都应该指向新的有效数据:

mem1

然后你的for循环(可以用`u_char * mem1 = new u_char[bytes];` 代替)将正常工作,你可以保留memcpy,因为你每次都会存储一个指向不同内存区域的指针。就像现在一样,每个l1.pload = mem1指向相同的内存区域,这就是为什么你在每个记录中看到相同的值。

当然,由于您正在分配内存,因此当您完成向量时,您必须记住为向量中的每个li.pload删除pload