没有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-errorsgcc 将停止翻译。

【讨论】:

如果假设我编译为 gcc -std=89 仍然是由于可变长度数组代码编译为 c99 ?如果我使用gcc -std=89 -pedantic-errors,那么编译器将表现为 c89 并且不编译? 是的,这就像编译器让我们选择我们想要的行为方式,而不是完全遵循上述标准。我们应该如何理想地预测行为? @GrijeshChauhan 关于-pedanticgcc 文档说有效的 ISO C 和 ISO C++ 程序应该在有或没有这个选项的情况下正确编译 [...] 但是,如果没有这个选项,某些还支持 GNU 扩展和传统的 C 和 C++ 功能。使用此选项,它们会被拒绝。 那么,根据所使用的编译器,可以肯定地说该程序作为 C90 程序具有未定义的行为吗? @Flipper 可以肯定地说该程序不是严格符合 c90 程序(违反 c90 6.5.4.2 约束)。

以上是关于没有malloc的c中的动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)

怎么查看动态分配内存空间的大小(c语言)。

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

malloc内存分配

汇编:没有 malloc 和系统调用的动态内存分配? [FreeDOS 应用程序]

动态内存分配