C / C ++中的动态内存分配通过http://www.progeneticlagarita.com/css/styles.css
和执行代码后分配的静态内存分配ex:malloc
进行。
但是这个代码int a[3];
只能在一个值归属于y之后才会发生,这会在执行时发生,所以它的静态,动态或两者兼而有之?编译器是否自动在机器代码中插入malloc?
答案 0 :(得分:4)
它是可变长度数组(VLA)。维基百科:http://en.wikipedia.org/wiki/Variable-length_array
从技术上讲,它在C ++中是不合法的,但编译器通常支持它作为扩展,但在打开时会生成警告。看到 Why aren't variable-length arrays part of the C++ standard?
在C中是合法的。
答案 1 :(得分:0)
0
在堆栈中,而int[]
' d或malloc
' d堆在堆上。
非常基本new
在到达时自动分配(其中y已知),并在超出范围时被删除。它不是在启动时已分配的所有内容。
没有隐藏的int[]
调用或东西,这就是堆栈内存的工作原理。
(我希望得到实际了解C / C ++的人的回答)
答案 2 :(得分:-1)
int x[y+1]
无法发生。您只能拥有int x[SOME_CONSTANT_HERE]
。如果y
被声明为const,那么这将起作用。
那是因为C / C ++中没有魔法 - 文件范围的项目只会在编译时分配,而本地项目会被推送和放弃。当它们进入和离开范围时(即,当执行进入并离开一个块时),弹出堆栈(如Felk所提到的)。但后者不是通过malloc()在你思考它的方式上进行动态分配;它是(用户)堆栈。
(注意:显然一些C99编译器会让你声明一个变量大小为的数组,如果数组是一个局部变量,那么在用户堆栈上创建。如果你肯定是一个错误但是,尝试使用文件范围的变量执行此操作。)