这个数组在C中是否可行?还有其他办法吗?

时间:2015-02-27 17:45:20

标签: c arrays declaration

我在C中声明了一个大小为150X150X150的数组。在编译程序以获得相同大小的数组时,编译器没有给出任何错误或警告。但是当我尝试运行它时,程序停止响应。

void main(){
 int i,j,k;
 char giv[150][150][50],tar[150][150][50];
 for(int i=0;i<150;i++)
 {
  for(j=0;j<150;j++)
  {
   for(k=0;k<50;k++)
    cin>>giv[i][j][k];
  }
 }
}

有没有办法在不造成运行时错误的情况下创建150 * 150 * 150的数组? 编辑:我知道多维数组工作。这不是编译错误。它是一个运行时错误,其原因是我无法查明。

3 个答案:

答案 0 :(得分:7)

你刚刚在堆栈上声明了两个数组。

每个阵列的大小:150 * 150 * 50字节,或大约1.1MB 所以你要求筹码2.2MB。

典型的堆栈大小约为1或2MB。

所以我希望你得到一个StackOverflow异常。
(有点适合本网站)

答案 1 :(得分:2)

似乎问题在于堆栈内存的限制。

在C ++中,您可以使用标准容器std::vector

在C语言中,您可以自动动态分配这些数组。

最简单的方法是全局声明这些数组在任何函数之外,或者指定数组具有静态存储持续时间的关键字static。例如

static char giv[150][150][50],tar[150][150][50];

对于其他语言,例如Java和C#在托管堆中分配数组。它只在堆栈中保留对数组的引用。

答案 2 :(得分:2)

您可以在堆上分配数组:

#include <stdlib.h> /* for malloc()/calloc() */
#include <stdio.h> /* for perror() */

...

char (*pgiv)[150][150][50] = malloc(sizeof *giv);
char (*ptar)[150][150][50] = malloc(sizeof *tar);

如果你想拥有阵列&#39;在分配使用0时初始化为所有calloc()的元素如下:

char (*pgiv)[150][150][50] = calloc(1, sizeof *giv); 
char (*ptar)[150][150][50] = calloc(1, sizeof *tar);

同时测试分配是否成功:

if (NULL == pgiv)
  perror("malloc() failed");
if (NULL == ptar)
  perror("malloc() failed");

通过例如:

来寻址元素
(*pgiv)[0][1][2] = 123;

请注意,pgivptar实际上是指针(指向数组)。这就是为什么在像数组一样使用之前需要取消引用它们(使用解除引用运算符*)。