我有一个数组int Array[17000][10][6][6]
对malloc一个巨大的数组用C
但我得到段错误时,我声明。
到目前为止,我一直在使用小数组,我知道我必须使用malloc,但我不知道如何和我一直有一段时间试图了解我找到的教程。
感谢您的帮助提前
Tamalero
我有一个数组int Array[17000][10][6][6]
对malloc一个巨大的数组用C
但我得到段错误时,我声明。
到目前为止,我一直在使用小数组,我知道我必须使用malloc,但我不知道如何和我一直有一段时间试图了解我找到的教程。
感谢您的帮助提前
Tamalero
你可以像在Tamalero's answer,但你可能会搜集它可以成为一个有点笨拙。
另一种方法是手动执行索引,即分配一个只包含数据(整数)的紧凑数组,没有指针数组。
然后通过施加所需的表达式,来计算从阵列到所需的元素的开始的偏移量做索引:
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个内存访问。
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 done\n");
甚至比任何现有的两个答案(仅当维度是静态的,当然适当的)简单:
int (*array)[10][6][6] = malloc(17000 * sizeof(*array));
array[w][x][y][z] = 4711; // ... "natural" indexing ...
free(array);
另外,中array
类型是几乎一样在OP的原码。
堆叠溢出! – haccks
我做错了什么? – Tamalero
庞大的多维数组在所有可能性上都太大而不适合堆叠,因此使其溢出。 haccks正在提及网站的名称和你的问题。 – Kninnug