我正在尝试为我的程序分配内存块。我需要分配 8 个内存块,每个内存块有 62500 字节 (sizeof Int * 32)。在某种程度上,我为每个 block 分配了 2,000,000 位( block 的总数为 8)。
我尝试使用 int *a= (int*) calloc(62500 * 8, sizeof(int))
并使用
int i=0;
for (i = 0; i < 62500 * 8; i++) {
blk[i] = i;
}
我使用上面的方法为每个地址分配一个值,以便很容易地跟踪我需要获取的索引,因为与数组不同,数组是连续的内存块,如果我使用 calloc,我不会获得连续的内存地址。但我的问题是我希望 8 个 block 中的每一个分配的起始索引为 0,结束索引为 62500。比如 block1(0...62500) 、block2(0...62500)、block3(0.. .62500) ... block8(0...62500)
。我不确定如何获得这种结构。
我从这样的事情开始:
typedef struct block {
int b;
} blk;
我如何制作一个struct *blk = {block1,block2,block3...block8}
,以便我可以从指针 *blk 到达每个 block 。
谢谢
最佳答案
获取指向数组数组的指针。
#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;
关于c - 如何在 C 中使用一个引用创建多个内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040393/