LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1131|回复: 8

一个C++编译器的问题

[复制链接]
发表于 2005-7-16 14:27:01 | 显示全部楼层 |阅读模式
各位程序员兄弟,我们都知道C/C++语言里面不能这样

int a=10;
int b[a];
编译通不过,因为不能在栈上分配内存,只能在堆中动态分配。
但是我想编译器为什么不把这种语句编译成需要动态分配的时候在栈中就分配出那些内存呢?这样直接就用也不要删除了。
我是浅薄的,C++标准不是按我说的这样做一定有他的道理,但是谁能详细的讲一讲啊?
发表于 2005-7-16 17:31:18 | 显示全部楼层
栈的主要目的是支持函数调用,尤其是递归调用,而不是提供内存空间。它的大小是很有限的,如果允许随意的动态分配是很危险的。

而堆的主要目的是提供动态内存分配,为什么你想在栈上动态分配呢,有什么意义?
回复 支持 反对

使用道具 举报

发表于 2005-7-16 20:41:52 | 显示全部楼层
Post by Sevenever
各位程序员兄弟,我们都知道C/C++语言里面不能这样

int a=10;
int b[a];
编译通不过,因为不能在栈上分配内存,只能在堆中动态分配。
但是我想编译器为什么不把这种语句编译成需要动态分配的时候在栈中就分配出那些内存呢?这样直接就用也不要删除了。
我是浅薄的,C++标准不是按我说的这样做一定有他的道理,但是谁能详细的讲一讲啊?

你用gcc试过吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-17 10:35:39 | 显示全部楼层
现在试了,可以哦,真NB
回复 支持 反对

使用道具 举报

发表于 2005-7-17 20:20:34 | 显示全部楼层
................
回复 支持 反对

使用道具 举报

发表于 2005-7-18 01:15:44 | 显示全部楼层
把=10去掉再试试
如果也行那才真NB
回复 支持 反对

使用道具 举报

发表于 2005-7-18 09:42:11 | 显示全部楼层
Post by x11
把=10去掉再试试
如果也行那才真NB

这有关系吗? 你认为编译的时候编译器会检测那个 a 是否在之前有过赋值吗?

ps:当然运行时应该是会有错的
回复 支持 反对

使用道具 举报

发表于 2005-7-18 12:52:51 | 显示全部楼层
GCC编译通过, 但VC6 代的编译器未通过.
建议写代码还是不要写成这种形式. 还是很容易让人糊涂的.
回复 支持 反对

使用道具 举报

发表于 2005-7-18 20:18:22 | 显示全部楼层
动态数组是c99中支持的特性。或许以后会普及。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表