我正在制作一个大数组,
P_arr
的大小
int N = 30;
float P_arr[27000][4];
元素由
给出 int i = 0;
for (int u = 0; u < N; u++)
{
for (int w = 0; w < N; w++)
{
for (int v = 0; v < N; v++)
{
P_arr[i][2] = g_arr[v];
P_arr[i][1] = us_arr[w];
P_arr[i][0] = ua_arr[u];
i++;
}
}
}
使得行数始终为 N ^ 3。
一旦我增加 N > ~ 30,代码就无法写入
P_arr
并“退出并显示代码:-1073741571。”
我构造的数组有长度限制吗?我怎样才能解决这个问题来定义更大的数组,比如 N = 100?
在 C 编程语言中,数组允许的最大行数由多个因素决定,包括可用内存以及程序运行的特定平台或环境。 C 数组通常在堆栈或堆上分配,这些分配的可用内存可能会有所不同。
在堆栈上,数组的最大大小可以受到堆栈大小的限制,堆栈大小通常小于堆大小。堆栈大小通常限制为几兆字节,如果您尝试分配太大的数组,则可能会遇到堆栈溢出。
在堆上,数组的最大大小可能受到可用系统内存的限制。但是,堆通常允许比堆栈更大的分配。尽管如此,如果系统没有足够的可用内存,尝试在堆上分配大量数组可能会导致内存分配失败。
需要注意的是,超出可用内存,无论是在堆栈还是堆上,都可能导致程序崩溃、数据损坏或其他意外行为。
在实践中,如果您需要使用非常大的数组,您可能需要考虑使用 malloc() 和 free() 等函数进行动态内存分配,这些函数允许您根据需要在堆上分配内存。这种方法使您可以更好地控制内存使用,并可以帮助您避免与基于堆栈的数组相关的一些限制。
请记住,具体限制可能会因您使用的编译器、平台和系统配置而异。在 C 中使用数组时,了解目标环境的内存限制总是一个好主意。
考虑以下因素:
#include <limits.h>
#include <stdio.h>
int main(void)
{
printf("INT_MIN: %d\n", INT_MIN);
printf("INT_MAX: %d\n", INT_MAX);
return 0;
}
在我的机器上我得到:
$ gcc main.c; ./a.out;
INT_MIN: -2147483648
INT_MAX: 2147483647
如您所见
-2147483648 == -2^31
和 2147483647 == (2^31 - 1)
。
要增加范围,您可以使用
long int
:
#include <limits.h>
#include <stdio.h>
int main(void)
{
printf("LONG_MIN: %ld\n", LONG_MIN);
printf("LONG_MAX: %ld\n", LONG_MAX);
return 0;
}
我的输出是:
$ gcc main.c; ./a.out;
LONG_MIN: -9223372036854775808
LONG_MAX: 9223372036854775807
要显式设置位宽,您可以使用
int32_t
、int64_t
(也可能使用 __int128_t
中的 stdint.h
。
一旦我增加 N > ~ 30,代码就会失败
随着
i
增加 N*N*N
倍。 float P_arr[27000][4];
仅足以容纳 N
最多 30 个。
对于
N > 30
,请使用更大的 P_arr[]
,
#define SZ 35
int N = SZ;
float P_arr[SZ*SZ*SZ][4];