结构体的数据拷贝和清空

如图:
有一个大的结构体指针:struct Big *big;
里面有四个缓存,每一个缓存都是数组,每一个数组里面都是B的结构体指针。
我有两个需要;
1:memset 每个缓存
2:向每个缓存memcpy单个struct B 的指针数据

不知道有没有可行的方法。

图片说明

struct  B **b[4] 表示数组元素是二级指针的指针数组,即b[0]存放的是二级指针变量,那么b[0]的数据类型是struct B **,这点理解很关键!
b[0] 是个二级指针,指向一个一级指针的内存单元,即指向(struct B*)指针类型,而*b[0]是这个一级指针所指向的内存单元的首地址,而这个内存单元是(struct B)结构体类型。不管是一级指针变量还是二级指针变量,指针变量本身也是需要占用存储空间的,只不过它存放的是地址值而已,这点理解也很关键!

使用memset初始化的方法如下:

struct Big big;
for(i=0; i<4; i++){
        big.b[i] = (struct B**)malloc(sizeof(struct B *)); //动态分配一个一级指针变量内存单元,二级指针指向这个一级指针的内存单元
        *big.b[i] = (struct B *)malloc(sizeof(struct B));
        memset(*big.b[i], 0, sizeof(struct B));
}

要复制数据到单个struct B结构体,使用同样的方法:

struct B *data = malloc(sizeof(struct B));
for(i=0; i<4; i++)
    memcpy(*big.b[i], data, sizeof(struct B));

我写了一个示例程序如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct B{
    int b;
};

struct Big{
    int other;
    struct B **b[4];
};

int main()
{
    int i=0;
    struct Big big;
    for(i=0; i<4; i++){
        big.b[i] = (struct B**)malloc(sizeof(struct B *)); //动态分配一个一级指针变量内存单元,二级指针指向这个一级指针的内存单元
        *big.b[i] = (struct B *)malloc(sizeof(struct B));
        memset(*big.b[i], 0, sizeof(struct B));
    }
    struct B *data = malloc(sizeof(struct B));
    data->b = 999;
    for(i=0; i<4; i++){
        printf("*big.b[%d]=%p, **big.b[%d]=%d\n", i, *big.b[i], i, **big.b[i]);
        memcpy(*big.b[i], data, sizeof(struct B));
        printf("*big.b[%d]=%p, **big.b[%d]=%d\n\n", i, *big.b[i], i, **big.b[i]);
    }

    for(i=0;i<4;i++)
    {
        free(*big.b[i]);
        free(big.b[i]);
    }
    free(data);
    return 0;
}

运行结果如下:
F:\c_work>gcc demo.c -std=c99

F:\c_work>a.exe
*big.b[0]=0000000000B313F0, **big.b[0]=0
*big.b[0]=0000000000B313F0, **big.b[0]=999

*big.b[1]=0000000000B31430, **big.b[1]=0
*big.b[1]=0000000000B31430, **big.b[1]=999

*big.b[2]=0000000000B31470, **big.b[2]=0
*big.b[2]=0000000000B31470, **big.b[2]=999

*big.b[3]=0000000000B314B0, **big.b[3]=0
*big.b[3]=0000000000B314B0, **big.b[3]=999
从运行结果来看,赋值是正确的呀

https://blog.csdn.net/qq_35409127/article/details/78630254