首页 文章

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

提问于
浏览
2

我正在学习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 回答

  • 1

    我想在这里:

    memcpy(arr, person, 64);
    

    你可能想把它复制到第一个缓冲区:

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

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

  • 0

    您可以依赖大小为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个对象块中第一个的地址 .

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

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

相关问题