没有malloc的c中的动态内存分配
Posted
技术标签:
【中文标题】没有malloc的c中的动态内存分配【英文标题】:Dynamic memory allocation in c without malloc 【发布时间】:2013-10-13 01:57:41 【问题描述】:这是我的一位朋友编写的 C 程序。
据我所知,数组必须在 C99 引入 VLA 之前的编译时初始化,或者在运行时使用 malloc
。
但这里程序从用户那里接受const
的值并相应地初始化数组。
即使使用gcc -std=c89
,它也可以正常工作,但对我来说看起来很不对劲。
这一切都依赖于编译器吗?
#include <stdio.h>
int
main()
int const n;
scanf("%d", &n);
printf("n is %d\n", n);
int arr[n];
int i;
for(i = 0; i < n; i++)
arr[i] = i;
for(i = 0; i < n; i++)
printf("%d, ", arr[i]);
return 0;
【问题讨论】:
如果我按照你的建议编译它,我会看到警告test.c:7: warning: writing into constant object (argument 2)
,表明编译器知道这不好。
当然,这意味着这里真正的问题是您正在尝试修改const
对象。所以与 VLA 无关;)
它是 C99 之前的 GNU 扩展,使用 -pedantic
编译。
是的,我收到了警告,但我原以为编译器不会为我编译代码并且程序无法运行。为什么有些规则执行得很彻底,有些错误却被警告放过?
【参考方案1】:
这称为可变长度数组并在 C99 中允许。使用-pedantic
标志在c89
模式下编译,编译器会给你警告
[Warning] writing into constant object (argument 2) [-Wformat]
[Warning] ISO C90 forbids variable length array 'arr' [-Wvla]
[Warning] ISO C90 forbids mixed declarations and code [-pedantic]
【讨论】:
确实,但是 OP 询问的是-std=c89
。【参考方案2】:
将-pedantic
添加到您的编译选项(例如-Wall -std=c89 -pedantic
),gcc
会告诉您:
warning: ISO C90 forbids variable length array ‘arr’
这意味着您的程序确实不符合 c89/c90。
将-pedantic
更改为-pedantic-errors
和gcc
将停止翻译。
【讨论】:
如果假设我编译为gcc -std=89
仍然是由于可变长度数组代码编译为 c99 ?如果我使用gcc -std=89 -pedantic-errors
,那么编译器将表现为 c89 并且不编译?
是的,这就像编译器让我们选择我们想要的行为方式,而不是完全遵循上述标准。我们应该如何理想地预测行为?
@GrijeshChauhan 关于-pedantic
,gcc
文档说有效的 ISO C 和 ISO C++ 程序应该在有或没有这个选项的情况下正确编译 [...] 但是,如果没有这个选项,某些还支持 GNU 扩展和传统的 C 和 C++ 功能。使用此选项,它们会被拒绝。
那么,根据所使用的编译器,可以肯定地说该程序作为 C90 程序具有未定义的行为吗?
@Flipper 可以肯定地说该程序不是严格符合 c90 程序(违反 c90 6.5.4.2 约束)。以上是关于没有malloc的c中的动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章
C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)