使用c ++中的memcpy将struct写入char数组

时间:2015-01-13 03:01:59

标签: c++ arrays struct memcpy

我正在学习用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?

2 个答案:

答案 0 :(得分:1)

我想在这里:

memcpy(arr, person, 64);

您可能打算将其复制到第一个缓冲区中:

memcpy(arr[0], person, 64);

由于arrchar**,第一行将覆盖指针,而不是将数据复制到其中一个字符缓冲区中。

答案 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));

(了解如何在为声明为指针,数组和引用的参数传递值时处理参数。)