我正在学习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 回答
我想在这里:
你可能想把它复制到第一个缓冲区:
由于
arr
是char**
,第一行将覆盖您的指针,而不是将数据复制到其中一个字符缓冲区中 .您可以依赖大小为N的数组,其大小是其元素类型大小的N倍 .
您不应该依赖各种类型的尺寸 . 使用sizeof() . 虽然sizeof(char)定义为(sizeof_t)1 .
您不能依赖于其字段总和大小的记录大小 . 可以插入额外的字节以将某些类型对准到某些地址的多个 . 例如,可能在char [3]字段之后 . 例如,即使在最后,所以在记录类型的数组中,它在另一个之后正确对齐 .
new
返回"a pointer to N objects"即"a pointer to the start of an array of N objects",即N个对象块中第一个的地址 .(了解如何在为声明为指针,数组和引用的参数传递值时处理参数 . )