编程论坛
注册
登录
编程论坛
→
C++教室
数组问题,求教
x6988312
发布于 2012-12-07 20:02, 370 次点击
void vector(int n)
{
float vec[n]={0};
cout<<vec[1]<<endl;
}
一个数组可不可以这样定义?其中void vector(int n)是自定义函数
7 回复
#2
wp231957
2012-12-07 20:04
自己试试就知道了啊
估计是不可以的
#3
wuxia111111
2012-12-07 23:39
不行啊!
#include<iostream>
using namespace std;
void vector(int n)
{
float vec[n]={0}; //n必须为常量
cout<<vec[1]<<endl;
}
int main()
{
int m=5;
vector(m);
return 0;
}
#4
StarFall
2012-12-08 06:39
试了。。不行。。
#5
yuccn
2012-12-08 09:43
你对局部变量理解不够深刻了
这个肯定不行的啦
局部变量的空间的大小在编译的时候就要知道的,float vec[n]={0}; 这样,n是变量,他的大小是不确定的,有参数传入,编译器不可能知道n是多少。无法开辟堆栈空间。
这样吧
#define N 100
void vector()
{
float vec[N]={0};
cout<<vec[1]<<endl;
} // 样编译器知道开辟多少的空间
或者
#include<iostream>
using namespace std;
void vector(int n)
{
float *vec = new float[n]; // 不用栈空间,用堆空间
cout<<vec[1]<<endl; // 还没有赋值的哦,同时n = 1的时候就有内存违规了
delete []vec;
}
[
本帖最后由 yuccn 于 2012-12-8 09:44 编辑
]
#6
yuccn
2012-12-08 09:50
局部变量的空间,在编译的时候就要确定的了,其实就是调整寄存器esp而已, esp始终指向栈顶部,调整的时候也就是开辟了堆栈空间了,
比如 int i;
那么32位机器对应的汇编吗可能是 sub esp 4,4也就是i的空间大小。这个在编译时候就已经确定下来了
动态的空间 只能在堆中new 或者malloc出来了
#7
x6988312
2012-12-08 21:44
回复 5楼 yuccn
使用new就可以创建任意大小的数组,如果不使用new或malloc是不是就不能创建任意大小的数组了?也就是说,一定要事先声明数组的大小后
才能创建???
#8
yuccn
2012-12-08 22:30
回复 7楼 x6988312
“任意大的数组” 这个,只要大小确定的,都可以用局部变量,不过这个大小有限制,默认每个线程堆栈空间好像为1M,所以数组的大小(也就是局部变量的中大小)不能大于这个值
如果你不想用new申请堆的空间,可以用全局数组。
1