我正在学习用c ++进行内存管理。 假设我在c ++中有一个char数组
char **arr = new char*[16];
for (int i = 0; i<8; i ++) {
arr[i] = new char[64];
}
现在每个块大64字节。
数组的第一个索引(第一个块)是为整数数组保留的,例如: int A [16]。 我需要A [16]到第一个,所以我使用以下代码:
memcpy(arr[0], &A, 8);
然后我需要将Struct信息放入char数组。
struct Person{
char name[3];
int age;
int s_id;
int ssn;
};
现在这个结构是16个字节,我可以把4个Person对象放在一个块中。
但问题是,如何通过使用内存复制来实现它?我知道如何做整数,但我不知道如何将struct存储到char数组中。
我认为将这些结构放入一个struts数组然后复制到数组中会更容易。
Person* person = new Person[4];
memcpy(arr[1], person, 64);
但是这段代码粉碎了,我相信是内存问题,但是调试器对它没有任何意义。 我想我不是连续分配内存所以我没有正确使用memcpy?
答案 0 :(得分:1)
我想在这里:
memcpy(arr, person, 64);
您可能打算将其复制到第一个缓冲区中:
memcpy(arr[0], person, 64);
由于arr
为char**
,第一行将覆盖指针,而不是将数据复制到其中一个字符缓冲区中。
答案 1 :(得分:0)
您可以依赖大小为N的数组,其大小是其元素类型大小的N倍。
您不应该依赖各种类型的尺寸。使用sizeof()。虽然sizeof(char)定义为(sizeof_t)1。
您不能依赖于其字段总和大小的记录大小。可以插入额外的字节以将某些类型对准到某些地址的多个。例如,可能在char [3]字段之后。例如,即使在最后,所以在记录类型的数组中,它在另一个之后正确对齐。
new
返回“指向N个对象的指针”,即“指向N个对象数组开始的指针”,即N个对象块中第一个的地址。
Person* pperson4 = new Person[4];
Person person;
Person person4[4];
// one of these
char *parr = new char[4*sizeof(Person)];
char *parr = new char[4*sizeof(person)];
char *parr = new char[sizeof(Person[4])];
char *parr = new char[sizeof(person4)];
// one of these
char arr[4*sizeof(Person)];
char arr[4*sizeof(person)];
char arr[sizeof(Person[4])];
char arr[sizeof(person4)];
/*
destination argument is parr or &arr[0] or arr or &arr
source argument is either
pperson4 or &person4[0] as address of 1st of 4 objects sizeof(Person)
&person4 or person4 as address of 1 object sizeof(person4)
length argument is one of
sizeof(person4), sizeof(Person[4]), 4*sizeof(Person), 4*sizeof(person)
*/
// thus any of these etc
memcpy(parr, pperson4, 4*sizeof(Person);
memcpy(parr, pperson4, sizeof(Person[4]));
memcpy(parr, person4, sizeof(person4);
memcpy(arr, pperson4, 4*sizeof(person));
memcpy(&arr, &person4, sizeof(Person[4]));
memcpy(&arr[0], &person4[0], sizeof(person4));
(了解如何在为声明为指针,数组和引用的参数传递值时处理参数。)