我正在尝试为我的程序分配内存块。我需要分配8块内存,每块内存有62500bytes(sizeof Int * 32)。在某种程度上,我为每个块分配2,000,000位(块总数为8)。
我尝试使用int i=0;
for (i = 0; i < 62500 * 8; i++) {
blk[i] = i;
}
并使用
block1(0...62500) , block2(0...62500),block3(0...62500) ... block8(0...62500)
我使用上面的方法为每个地址分配一个值,以便很容易跟踪我需要获取的索引,因为与连续的内存块数组不同,如果我使用calloc,我不会得到连续的内存地址。但我的问题是我想要将8个块中的每个块分配一个起始索引为0并结束为62500.Like typedef struct block {
int b;
} blk;
。我不知道如何获得这种结构。
我开始使用类似的东西:
struct *blk = {block1,block2,block3...block8}
如何制作{{1}},以便我可以从指针* blk到达每个块。
由于
答案 0 :(得分:2)
获取指向数组数组的指针。
#define BLK_SZ 62500
#define BLK_NMEMB 8
这里的括号表示blk是指向数组的指针,而不是指针数组。
int (*block)[BLK_SZ][BLK_NMEMB] = calloc(62500 * 8, sizeof(int));
请注意,转换是不必要的,因为void *可以保证转换为任何其他指针类型。现在你可以解决它:
(*block)[0][9001] = 14;
您还可以创建一个typedef:
typedef int blk[BLK_SZ][BLK_NMEMB];
然后可以用作:
blk *block = calloc(BLK_SZ * BLK_NMEMB, sizeof(int));
并以与上述相同的方式解决。
如果你真的必须,你可以这样做:
typedef struct {
int block0[BLK_SZ];
int block1[BLK_SZ];
int block2[BLK_SZ];
int block3[BLK_SZ];
int block4[BLK_SZ];
int block5[BLK_SZ];
int block6[BLK_SZ];
int block7[BLK_SZ];
} blk;
和
blk *block = calloc(BLK_SZ * BLK_NMEMB, sizeof(int));
加入
(*block).block0[9001] = 14;