我在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的数组? 编辑:我知道多维数组工作。这不是编译错误。它是一个运行时错误,其原因是我无法查明。
答案 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;
请注意,pgiv
和ptar
实际上是指针(指向数组)。这就是为什么在像数组一样使用之前需要取消引用它们(使用解除引用运算符*
)。