C语言中malloc和静态数组最多能开到多大呢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中malloc和静态数组最多能开到多大呢相关的知识,希望对你有一定的参考价值。

取决于物理系统剩余内存大小。
在C语言中,malloc动态开辟的空间,以及静态数组均是占用堆上的内存的。
而系统堆内存是与进程无关的,堆内存的剩余量,就是系统内存的剩余量,包括物理内存和虚拟内存。
所以,只要系统内存剩余有多大,那么malloc和静态数组就可以开多大。
不过,由于系统内存剩余量并非固定,而是由系统运行实际情况决定的,所以在编程中,一般不会使用过大的静态数组,或动态内存,以免出现运行不稳定的问题。
参考技术A 其实malloc函数来说的话,应该是能开到 剩余内存+虚拟内存的大小。但是你一般不需要用到这么大的内存,所以用malloc函数而言是绝对足够的。

另外C的话静态数组一般是1000000*int 字节。主要看你系统的内存环节。本回答被提问者采纳
参考技术B 静态数组最多能开到2K字节,相当于1024个整数。
malloc开辟的动态数组容量则与机器的内存总容量和当前占用的内存容量有关系。

其实静态数组和动态数组都要占用内存,只是静态数组占用的是程序的栈区,栈区一般只有2KB,而动态数组则没有容量限制,但是已经占用的内存不能开辟动态空间。
参考技术C 语法上没有规定最大。
计算机用虚拟存储,也就是存储器里RAM里放不下时,就写到磁盘里去,要用的数据块从磁盘里读进来,不用的数据块,放到盘里。利用倒进倒出,多大的数组都可以,只是程序执行效率变低了。
三维图形动态显示,常要很大的数组,高效率的显示卡(硬件)会带额外的RAM。
理论上说,只要不超过硬件许可,开多大都可以。实际上,有限制。
我的计算机,这个可以:
#include<stdio.h>
int a[1000000]; // 全局量,允许比较大的数组
int main()
a[999999]=999999;
printf("%d ",a[999999]);
return 0;


若int a[1000000]; 放到main()里,就不行了。
---
C语言无符号整型数有最大限制,所以一个维的大小,不能超过整型数最大限制。
malloc 动态分配,可以测定,分配是否成功。

C -(malloc、calloc 或静态)从函数返回的 2d 字符数组

【中文标题】C -(malloc、calloc 或静态)从函数返回的 2d 字符数组【英文标题】:C - (malloc, calloc, or static) 2d char array returned from function 【发布时间】:2018-12-29 23:48:50 【问题描述】:

我已经在这个网站上呆了几个小时了,我阅读了很多新技术和编程定义的函数,但我仍然对如何将它应用到我自己的程序中感到有些困惑。我试图慢慢开始并建立一个跳棋游戏。所以首先我创建了一个函数来创建一个 Board。当然,我研究并读到 C 不容易让您从函数返回 char 数组。所以我阅读了使用 malloc 或 calloc 的内存分配。

所以我的第一个错误......

void printBoard(char arr[9][19]);
int makeMove(char arr[11][23], int king, struct player P, char player);
char *createBoard();

char Rows[8]="ABCDEFGH";

int main()

    int x, y;
    int isKing = 1;
    char checkerBoard[9][19];

    checkerBoard[9][19] = createBoard();
    printBoard(checkerBoard);
    /* ... */

然后……

void printBoard(char array[9][19])


    for (int i = 0; i < 9; i++) 
        for (int j = 0; j < 19; j++)
            printf("%c", array[i][j]);
    
    printf("\n");
;

char * createBoard()

    // where I put code

    return  checkerBoard[9][19];

我故意省略了 createBoard() 中的代码,这很多。因此,当使用 void *malloc(size_t size) 时,我知道我需要指定大小为 4 * sizeof(char) 的字节,但数组的大小也不在那里吗?另外,将 checkerBoard 数组更改为静态会更好吗?

【问题讨论】:

4 * sizeof(char)4 * 1 相同。 char Rows[8]="ABCDEFGH";你没有空间'\0' 尝试理解This DEMO 问题不清楚吗? 【参考方案1】:

很高兴您正在阅读 C 中的数组。您在问题中提到您读到“C 不允许您轻松地从函数返回数组”。在 C 中,当您在函数内声明一个静态大小的数组时,内存中的该数组存在于堆栈中。每个函数都有自己的堆栈,因此当您从函数返回时,可以再次重用该内存。

当您使用 malloc 和 calloc 分配空间时,它会在堆上分配空间。这是一篇提供更多信息的文章:Stack Vs Heap。

现在进入你的棋盘问题,你想要的是一个数组数组。您可以将棋盘上的每个方格视为一个单独的字符。假设我们的棋盘有一排。

char * row_zero = malloc(sizeof(char) * 15); //row_zero has a length of 15

棋盘显然不止一排,那么 9 行呢?

char * row_zero = malloc(sizeof(char) * 15);
char * row_one = malloc(sizeof(char) * 15);
.
.
char * row_eight = malloc(sizeof(char) * 15);

虽然你可以做到这一点,但它会非常混乱。因此,您可以简单地拥有一个指向指针数组的指针,而不是创建单独的行。

char ** my_checkerboard = malloc(sizeof(char*) * 9); //has 9 rows.

我会让你弄清楚如何完成你的电路板。

【讨论】:

那么如何访问或修改其中的一行? @卡森 上面的棋盘格是一个char *数组。索引到棋盘格会给你一个 char *,你也可以索引到它。

以上是关于C语言中malloc和静态数组最多能开到多大呢的主要内容,如果未能解决你的问题,请参考以下文章

C -(malloc、calloc 或静态)从函数返回的 2d 字符数组

c语言中啥是动态分配内存?

用C语言编写

C语言动态开辟指针的指针问题

幻方算法 C语言描述

单片机C语言数组最多能定义多少个元素?