c - 当我可以定义一个可变长度数组时,为什么要使用 malloc()?
问题描述
我正在阅读有关在 C 中动态创建数组的信息。因此,所描述的正确方法是:
int n;
scanf("%d", &n);
int *arr = (int*)malloc(n*sizeof(int));
但后来我想如果我能做这样的事情——
int n, i, sum=0;
scanf("%d", &n);
int arr[n];
我编译并运行它没有任何错误。所以,我的问题是我为什么要使用malloc()
?这是否与新旧 C 版本有关?
解决方案
malloc
使用可变长度数组至少有五个好处。
最值得注意的是,使用创建的对象在
malloc
当前块执行结束后仍然存在。这意味着这些对象可以(通过指针)返回给函数的调用者。这种用法在实际应用中很常见。创建为可变长度数组的数组在其块执行结束时将不复存在。用 创建的数组
malloc
可以用 调整大小realloc
。可变长度数组无法调整大小。从 2011 C 标准开始,可变长度数组对于 C 实现来说是可选的以支持。任何质量的通用 C 实现都将支持它们,但它们是可选的事实意味着旨在可移植的代码必须不使用可变长度数组,或者必须通过测试预处理器宏
__STDC_NO_VLA__
并提供备用代码。通常,可变长度数组的大小比使用
malloc
. 可变长度数组通常使用堆栈空间来实现,并且堆栈通常被限制为一些不大的兆字节(尽管在构建可执行文件时通常可以增加)。对于使用 创建的对象malloc
,现代系统中可能有千兆字节的内存可用。如果数组的创建确实失败了
malloc
,NULL
将被返回,程序员可以很容易地编写代码来检测并处理它。如果创建可变长度数组失败,常见的行为是操作系统以一些内存错误终止程序。(各种 C 实现可能会提供拦截此错误的方法,但它比测试 的malloc
返回值要麻烦得多NULL
,而且它不可移植。)
推荐阅读
- google-admin-sdk - 当我使用 REST 资源时收到很多警告:userUsageReport
- c# - 在 TextBox.Text 中退格后 Regex.IsMatch 不起作用
- julia - 模拟反射边界 SDEProblem
- php - 在PHP中增加变量日期
- java - TomEE web profile 7.1.4没有加载ejb jar?
- android - Android ItemTouchHelper:如何在 Swipe 期间绘制成长的圆圈
- linux - Shell 脚本意外令牌
- c# - 从 Razor 页面使用 JSON 更新 chart.js
- html - 将徽标定位到页面的左上角?
- slack-api - 当一个(松弛)机器人离开频道时,我怎样才能让机器人中的一个事件告诉它这已经发生了?