此数组是否有允许的最大行数? C

问题描述 投票:0回答:3

我正在制作一个大数组,

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?

arrays c size limit
3个回答
1
投票

在 C 编程语言中,数组允许的最大行数由多个因素决定,包括可用内存以及程序运行的特定平台或环境。 C 数组通常在堆栈或堆上分配,这些分配的可用内存可能会有所不同。

在堆栈上,数组的最大大小可以受到堆栈大小的限制,堆栈大小通常小于堆大小。堆栈大小通常限制为几兆字节,如果您尝试分配太大的数组,则可能会遇到堆栈溢出。

在堆上,数组的最大大小可能受到可用系统内存的限制。但是,堆通常允许比堆栈更大的分配。尽管如此,如果系统没有足够的可用内存,尝试在堆上分配大量数组可能会导致内存分配失败。

需要注意的是,超出可用内存,无论是在堆栈还是堆上,都可能导致程序崩溃、数据损坏或其他意外行为。

在实践中,如果您需要使用非常大的数组,您可能需要考虑使用 malloc() 和 free() 等函数进行动态内存分配,这些函数允许您根据需要在堆上分配内存。这种方法使您可以更好地控制内存使用,并可以帮助您避免与基于堆栈的数组相关的一些限制。

请记住,具体限制可能会因您使用的编译器、平台和系统配置而异。在 C 中使用数组时,了解目标环境的内存限制总是一个好主意。


0
投票

考虑以下因素:

#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


0
投票

一旦我增加 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];
© www.soinside.com 2019 - 2024. All rights reserved.