![]() |
1
73
这不是“静态内存分配”。您的阵列
语言规范没有规定任何特定的分配机制,但在典型的实现中
对于VLA
其主要目的是
与您的示例一样,VLA不提供这种“破坏范围”的功能。您的阵列
但在特定情况下,当你不需要“打败范围”而只需要使用
|
![]() |
2
11
在C语言中,编译器支持VLAs(可变长度数组)的方式取决于编译器-它不必使用
|
![]() |
3
10
可变长度数组的内存显然不能静态分配。但是,它可以在堆栈上分配。通常,这涉及使用“帧指针”来跟踪函数堆栈帧的位置,以应对堆栈指针的动态确定更改。 当我试图编译你的程序时,实际发生的事情似乎是可变长度数组得到了优化。所以我修改了你的代码,迫使编译器实际分配数组。
使用gcc 6.3为arm编译Godbolt(使用arm,因为我可以阅读arm ASM)将其编译为 https://godbolt.org/g/5ZnHfa . (我的评论)
|
![]() |
4
3
该构造的内存称为“可变长度数组”,VLA,在堆栈上分配,分配方式与
[1] 对于使用“向零增长”堆栈的典型处理器。 |
![]() |
5
0
编译时间 ,这意味着这些变量的位置是由编译器生成的可执行代码决定并嵌入其中的,而不是编译器在工作时为它们腾出可用空间。 实际的动态内存分配是由生成的程序在运行时执行的。 |
![]() |
Jean-Francois T. · C(C99)中嵌套函数调用的限制 7 年前 |
![]() |
Tarun Maganti · 字符串在C中是如何工作的? 7 年前 |
![]() |
Mushy · 另一个空洞的话题;我只是想问一下,因为我很困惑 7 年前 |
![]() |
Rahul · 编译器如何在编译时不知道内存大小的情况下分配内存? 7 年前 |
![]() |
Sam · 将十六进制转换为循环中的一个字符串 7 年前 |
![]() |
Dror K. · 用%p打印空指针是未定义的行为? 7 年前 |
![]() |
lvella · 这个代码有效吗?[已关闭] 8 年前 |