如何使用C中的一个引用创建多个内存块

时间:2015-05-04 21:34:21

标签: c memory memory-management

我正在尝试为我的程序分配内存块。我需要分配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到达每个块。

由于

1 个答案:

答案 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;