如图:
有一个大的结构体指针:struct Big *big;
里面有四个缓存,每一个缓存都是数组,每一个数组里面都是B的结构体指针。
我有两个需要;
1:memset 每个缓存
2:向每个缓存memcpy单个struct B 的指针数据
不知道有没有可行的方法。
如图:
有一个大的结构体指针: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
从运行结果来看,赋值是正确的呀