2013-12-17 27 views
4

我有一个数组int Array[17000][10][6][6]对malloc一个巨大的数组用C

但我得到段错误时,我声明。

到目前为止,我一直在使用小数组,我知道我必须使用malloc,但我不知道如何和我一直有一段时间试图了解我找到的教程。

感谢您的帮助提前

Tamalero

+12

堆叠溢出! – haccks

+0

我做错了什么? – Tamalero

+0

庞大的多维数组在所有可能性上都太大而不适合堆叠,因此使其溢出。 haccks正在提及网站的名称和你的问题。 – Kninnug

回答

2

你可以像在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个内存访问。

0
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"); 
+0

每当我看到别人的时候,我的脑袋就会出现OUCH,所以我认为放松的答案应该会更好。但是这有更多的知名度。或者它看起来很...... – zoska

+0

大声笑你说得对,重要的是补充说这个解决方案适用于阵列的动态大小。 – Tamalero

1

甚至比任何现有的两个答案(仅当维度是静态的,当然适当的)简单:

int (*array)[10][6][6] = malloc(17000 * sizeof(*array)); 

array[w][x][y][z] = 4711; // ... "natural" indexing ... 

free(array); 

另外,中array类型是几乎一样在OP的原码。

相关问题