注册 登录
编程论坛 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
wp2319572012-12-07 20:04
自己试试就知道了啊

估计是不可以的
#3
wuxia1111112012-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
StarFall2012-12-08 06:39
试了。。不行。。
#5
yuccn2012-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
yuccn2012-12-08 09:50
局部变量的空间,在编译的时候就要确定的了,其实就是调整寄存器esp而已, esp始终指向栈顶部,调整的时候也就是开辟了堆栈空间了,
比如 int i;
那么32位机器对应的汇编吗可能是 sub esp 4,4也就是i的空间大小。这个在编译时候就已经确定下来了
动态的空间 只能在堆中new 或者malloc出来了
#7
x69883122012-12-08 21:44
回复 5楼 yuccn
使用new就可以创建任意大小的数组,如果不使用new或malloc是不是就不能创建任意大小的数组了?也就是说,一定要事先声明数组的大小后
才能创建???
#8
yuccn2012-12-08 22:30
回复 7楼 x6988312
“任意大的数组” 这个,只要大小确定的,都可以用局部变量,不过这个大小有限制,默认每个线程堆栈空间好像为1M,所以数组的大小(也就是局部变量的中大小)不能大于这个值

如果你不想用new申请堆的空间,可以用全局数组。
1