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

Is this array possible in C? Is there any other way for it?

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

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 的数组而不导致 运行 时间错误? 编辑:我知道多维数组有效。这不是编译错误。这是一个 运行 时间错误,其原因是我无法查明。

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

每个数组的大小:150 * 150 * 50 字节,或大约 1.1MB。
所以你要从堆栈中请求 2.2MB。

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

所以我预计您会遇到 Whosebug 异常。
(有点适合这个网站)

看来问题出在堆栈内存的限制上。

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

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

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

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

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

您可以在堆上分配数组:

#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);

如果您想在分配时将数组的元素初始化为所有 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实际上是指针(指向一个数组)。这就是为什么在像数组一样使用它们之前需要取消引用(使用取消引用运算符 *)。