在C中对一个巨大的数组进行malloc



我有一个数组int Array[17000][10][6][6]

但我在声明时出现了分段错误。

到目前为止,我只使用了小数组,我知道我必须使用malloc,但我不知道如何使用,我一直在努力理解我找到的教程。

感谢您提前帮助

Tamalero

你可以像Tamalero的答案一样做,但正如你可能发现的那样,它可能会变得有点笨拙。

另一种选择是手动进行索引,即只分配一个数据(整数)的紧凑数组,而不分配指针数组。

然后通过应用所需的表达式来计算从数组开始到所需元素的偏移量来进行索引:

const size_t ws = 17000, xs = 10, ys = 6, zs = 6;
int *array = malloc(ws * xs * ys * zs * sizeof *array);
array[w * (xs * yz * zs) + x * (ys * zs) + y * zs + z] = 4711;

当然,您可以将索引封装到宏中,以便于重复。

这将使用更少的内存,更容易设置,而且可能更快,因为它每次实际访问的内存访问次数更少,即由于指针追逐,每个维度1次而不是1次。

甚至比现有的两个答案中的任何一个都简单(当然,只有当维度是静态的时才适用):

int (*array)[10][6][6] = malloc(17000 * sizeof(*array));
array[w][x][y][z] = 4711;   // ... "natural" indexing ...
free(array);

此外,array的类型几乎与OP的原始代码中的类型相同。

int w=17000, x = 10, y = 6, z = 6;          
int ****array;
int i, j, k, l, m;
array = malloc(sizeof(int ***) * w);   /* size of an integer times the i length */
for(i = 0; i < w; ++i)
{   array[i] = malloc(sizeof(int **) * x);
    for(j = 0; j < x; ++j)
    {   array[i][j] = malloc(sizeof(int *) * y);
        for(k = 0; k < y; ++k)
        {   array[i][j][k] = malloc(sizeof(int) * z);
        }
    }
}
/* Check array */
m=0;
for (i = 0; i < w; i++) {
    for (j = 0; j < x; j++) {
        for (k = 0; k < y; k++) {
            for (l = 0; l < z; l++) {
                array[i][j][k][l] = m++;
            }
        }
    }
}
  m=0;
for (i = 0; i < w; i++) {
    for (j = 0; j < x; j++) {
        for (k = 0; k < y; k++) {
            for (l = 0; l < z; l++) {
                array[i][j][k][l] = m;
            }
        }
    }
}
/* free memory used to making the array */
 for (i = 0; i < w; i++) {
    for (j = 0; j < x; j++) {
        for (k = 0; k < y; k++) {
            free(array[i][j][k]);
            array[i][j][k] = NULL;
        }
        free(array[i][j]);
        array[i][j] = NULL;
    }
    free(array[i]);
    array[i] = NULL;
}
free(array);
array = NULL;
printf("Array prepare donen");

相关内容

  • 没有找到相关文章

最新更新