c - 如何在 C 中使用一个引用创建多个内存块

标签 c memory memory-management

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

相关文章:

python - Mathematica 到 Python/C 代码

c - GNU C 中的激活记录(嵌套函数)

c++ - 使用逻辑循环的动态内存阵列

c++ - C语言中如何使用内存地址?它们是十六进制还是无符号整数?

c - 使用 C 的原始 libcurl JSON PUT 请求

c - 有没有办法在 C 中为 i_block 创建迭代器风格的函数?

c - 分配静态内存(作为 malloc 替换)

c++ - 构造一个附加了可变数据量的对象

c - Sudoku C 递归函数无法正常工作

windows - 如何防止窗口分页内存块