开辟数组为何只能用常量,开辟动态数组却可以用变量?
element=newint*[row];//row可以是变量,这相当于开辟了一个动态指针数组而我们m[a][b];ab必须是常量,变量则报错...
element = new int *[row];// row可以是变量,这相当于开辟了一个动态指针数组
而我们 m[a][b]; a b必须是常量,变量则报错 展开
而我们 m[a][b]; a b必须是常量,变量则报错 展开
1个回答
展开全部
本质上变量有两种(按照内存分配方式不一样划分):
栈变量和堆变量。
栈变量:当生命周期开始时,会自动形成栈空间,分配栈变量。这种变量必须事先知道其大小。所以栈变量的大小必须是确定的。
堆变量:在进程空间中的专门开辟的堆空间中生成的变量。这部分可以动态生成,大小不限(当然要在进程空间占用限制之内)。
一般new出来的(c是malloc等)就是堆变量,而直接定义的则是栈变量。
堆变量的大小可在程序运行期动态指定。
而栈变量必须在入栈时静态制定,大小必须确定。
另:
1 生命周期在代码中(以C为语法),一般就是指大括号括起来的部分为一个独立生命周期,一般最多出现的就是函数,控制语句(for,while,if)后面跟的语句块。
2 栈空间对进程而言,空间是有限制的,如果程序大量分配栈变量,会栈移除。操作系统会报:“stack overflow”。注意:好的程序,尽可能少分配占较多内存的栈变量。
栈变量和堆变量。
栈变量:当生命周期开始时,会自动形成栈空间,分配栈变量。这种变量必须事先知道其大小。所以栈变量的大小必须是确定的。
堆变量:在进程空间中的专门开辟的堆空间中生成的变量。这部分可以动态生成,大小不限(当然要在进程空间占用限制之内)。
一般new出来的(c是malloc等)就是堆变量,而直接定义的则是栈变量。
堆变量的大小可在程序运行期动态指定。
而栈变量必须在入栈时静态制定,大小必须确定。
另:
1 生命周期在代码中(以C为语法),一般就是指大括号括起来的部分为一个独立生命周期,一般最多出现的就是函数,控制语句(for,while,if)后面跟的语句块。
2 栈空间对进程而言,空间是有限制的,如果程序大量分配栈变量,会栈移除。操作系统会报:“stack overflow”。注意:好的程序,尽可能少分配占较多内存的栈变量。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询