kangjianjiankang 2020-06-23 16:58 采纳率: 0%
浏览 543
已采纳

结构体的数据拷贝和清空

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

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

图片说明

  • 写回答

2条回答 默认 最新

  • 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
    从运行结果来看,赋值是正确的呀

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀