这个数组在 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;
注意pgiv
和ptar
实际上是指针(指向一个数组)。这就是为什么在像数组一样使用它们之前需要取消引用(使用取消引用运算符 *
)。
我在 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;
注意pgiv
和ptar
实际上是指针(指向一个数组)。这就是为什么在像数组一样使用它们之前需要取消引用(使用取消引用运算符 *
)。