社区
C++ 语言
帖子详情
关于数组定义问题
Dan1980
2006-07-02 12:09:45
定义一个数组时,如果使用:
int arr[SIZE];
这里的SIZE只能是编译时确定其值的表达式,如整数字面量,常量或它们的算术运算表达式,而不能是变量和非inline的函数调用。
请问这是标准规定的么?
为什么我用linux中的gcc编译:
unsigned f() { return 10; }
int main() {
int arr[f()];
}
也可以通过呢?并且cout << sizeof(arr)输出40,即10个int,完全正常啊。
...全文
425
11
打赏
收藏
关于数组定义问题
定义一个数组时,如果使用: int arr[SIZE]; 这里的SIZE只能是编译时确定其值的表达式,如整数字面量,常量或它们的算术运算表达式,而不能是变量和非inline的函数调用。 请问这是标准规定的么? 为什么我用linux中的gcc编译: unsigned f() { return 10; } int main() { int arr[f()]; } 也可以通过呢?并且cout << sizeof(arr)输出40,即10个int,完全正常啊。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pingzhang500
2006-07-03
打赏
举报
回复
这个,怎么说呢??要看什么编译器了!
基本的来说,最好不要用变量来声明数组,那样很麻烦,也不好记忆,优化程序
OOPhaisky
2006-07-02
打赏
举报
回复
fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)说得好极了!!强烈支持!!!
jixingzhong
2006-07-02
打赏
举报
回复
所以,可以认为是 C99 标准规定的 ...
但是不能说是 C++ 标准规定的 ...
C++ 支持这个而已 ...
jixingzhong
2006-07-02
打赏
举报
回复
C89 标准规定,数组大小必须是在编译时刻确定的;
在C99 中,这个标准项被扩展,可以是运行时刻确定的值。
也就是说, 可变长数组和 C++ 本身没有关系,
只要是支持 C99 的就可以使用可变长数组,
包括支持 C99 的 C 编译器 ...
需要注意的是,
可变长数组的维数在数组生存期内是不变的,
也就是说,可变长数组不是动态的,
可变的只是数组的大小。
引进这一特性的目的是为了支持数值处理 ...
houdy
2006-07-02
打赏
举报
回复
www.google.com
keyword: C99, VLA(Variable Length Array)
rollor_phoe
2006-07-02
打赏
举报
回复
支持楼上!
fireseed
2006-07-02
打赏
举报
回复
给楼主说一下,C++之所以这样规定,是考虑编译器将会把这样定义的数组存入栈内存中。而一个函数的栈大小是不可更改的,也就是说在编译器就固定了。而你试图用一个变量做为数组的长度定义,将导致编译器无法工作。
更详细的原理:
栈内存,又称堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。
在函数中,push和pop指定用来压栈和弹栈,在进入一个函数前,必须通过移动栈底/顶指针到一个固定的长度,这个长度也就是这个函数内所有的局部变量所占的内存总和,每一个局部变量都通过栈顶/底的指针加一个正/负偏移来访问。在函数结束前栈底/顶的指针又将移动到进函数时的位置。而这些动作是编译器直接就做好了的,不用你来操心。但是你就必须做出牺牲——你无法改变已经固化的函数栈大小。
至于为什么有些地方可以支持变量初始化数组,是因为很多编译器都没有按照标准C++来实现语法编译,编译器厂商有自己的考虑。如果一个编译器支持这样的代码,那我想它在底层一定是翻译成了这样:
int *arr = new int[SIZE];
在函数结束时:
delete[] arr;
也就是说,它使用了堆内存。
讨论不标准的C++编译器中的不标准语法,是很没有必要的事!
lddLinan
2006-07-02
打赏
举报
回复
可变长数组存储在堆中还是在栈中,检查一下地址就知道。(我相信他不会再堆中,否则就是败笔)
函数无非一些机器指令,没有自己的栈资源。
很多编译器(VC6.0),都是将所有局部的栈变量放在函数开始的位置进行分配,这就意味着在函数代码执行前,栈变量的大小必须确定,这样如果你需要动态的分配资源只能选择慢速的堆资源分配。
C99的新标准在很大程度上满足了快速分配动态栈资源的需求,不过相信这样做是有弊端的,否则为什么C++标准不加入呢?
还有
unsigned f() { return 10; }
int main() {
int arr[f()];
}
很可能被编译器优化为int arr[10];因为f为内联函数
Dan1980
2006-07-02
打赏
举报
回复
谢谢!
lyskyly
2006-07-02
打赏
举报
回复
不久前讨论过类似的
http://community.csdn.net/Expert/topic/4844/4844849.xml?temp=5.579776E-02
fdimim
2006-07-02
打赏
举报
回复
学习中,不要给我分~
C语言的
数组
定义
方式
C语言的
数组
定义
方式c语言
数组
定义
方式1、一维
数组
2、一维
数组
初始化3、一维
数组
元素的引用
数组
是存储数据的结构。由于单个变量所能存储的数据很有限,所以有了
数组
存储结构。不仅如此,
数组
和指针是相辅相成的,学习
数组
可以为学习指针打下基础。 注意:同一
数组
中存储的数必须满足以下两个条件: 这些数的类型必须相同。 这些数在内存中必须是连续存储的。 换句话说,
数组
是在内存中连续存储的具有相同类型的一组数据的集合。 c语言
数组
定义
方式 1、一维
数组
通常一维
数组
的
定义
方法为: 类型说明符
数组
名[常量表达式]; 例
java 对象
数组
定义
_Java对象
数组
定义
与用法详解
本文实例讲述了Java对象
数组
定义
与用法。分享给大家供大家参考,具体如下:所谓的对象
数组
,就是指包含了一组相关的对象,但是在对象
数组
的使用中一定要清楚一点:
数组
一定要先开辟空间,但是因为其是引用数据类型,所以
数组
里面的每一个对象都是null值,则在使用的时候
数组
中的每一个对象必须分别进行实例化操作。对象
数组
的声明先
定义
,再开辟空间类名称 对象
数组
名[] = null;对象
数组
名 = new 类名称...
matlab
定义
数组
和相关函数
matlab作为一个大型的计算软件,里面有许多对
数组
的操作,所以
数组
的
定义
和
数组
的操作是一个必不可少的部分。 1
数组
的
定义
在matlab中对
数组
的
定义
较为灵活,因为特殊矩阵较多,所以有许多特定的
定义
方法。比较常见的有三种: 普通
数组
定义
:用和C语言类似的
定义
方法,用分号隔开每行数据。 全零
数组
定义
:zeros(x,y),x代表行数,y代表列数...
JavaScript中
数组
定义
的几种方法,以及关于
数组
长度的讨论
大家在使用JavaScript编写脚本语言的时候,尤其是习惯使用Java语言的朋友,
定义
了一个固定长度的
数组
,但是使用了一个超出
定义
数组
的元素,程序并没有报“
数组
越界”错误,这到底是什么原因呢?今天我们来分享一下! 1、
数组
定义
的四种方法: var arr_1 = new Array(); var arr_2 = new Array(10); var arr_3 = new Array(8,...
数组
定义
及注意事项
怎样
定义
和引用一维
数组
一、一维
数组
是
数组
中最简单的,它的元素只需要用
数组
名加一个下标,就能唯一地确定。 怎样
定义
一维
数组
//
定义
数组
int array[100]; //表示着没有初始化的
数组
,仅仅请了100个整形数的内存空间 最好要初始化: int array[100]={0}; int array[3] = { 1,2,3 }; //有初始化的
数组
,完整初始化,该
数组
申请了三个整形数内存空间,并赋值三个数1,2,3 int array[100] = { 1,2,3 }; // 有初始化的
数组
,不完整
C++ 语言
65,209
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章