kangjianjiankang
kangjianjiankang
2020-06-23 16:58
采纳率: 50%
浏览 394

结构体的数据拷贝和清空

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

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

图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • u010429831
    yunfan188 2020-06-23 18:50
    已采纳
    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
    从运行结果来看,赋值是正确的呀

    点赞 评论
  • dashicaineng
    点赞 评论

相关推荐