导航:首页 > 源码编译 > 数组大小为什么必须在编译器确定

数组大小为什么必须在编译器确定

发布时间:2022-11-20 14:30:58

A. C语言中普通数组在定义的时候不给出数组的具体长度,那么计算机是在运行期间为其分配长度的吗

变长数组:数组长度为变量,在编译期间不能确定数组长度,要等到程序运行后,变量赋值后(数组定义语句不要写在变量赋值之前!),才能给数组分配内存。

变长数组本质还是静态数组(定义前大小可变,但定义后不能改变大小)。

要定义动态数组需要用malloc函数来申请内存。

B. 请问数组定义时,对于他的长度,不能通过输入函数(cin,scanf等)确定

例如
int a[SIZE];
其中
SIZE是且必须是一个常量,如5、1*5,或者
#define SIZE 5,const int SIZE = 5之类的,而不能是一个变量。
因为编译器在编译阶段必须确定数组的大小,以分配一定的内存,若是用输入函数输入的变量,则不能在编译阶段确定大小,只能在运行时才知道值。
所以,下面的代码是非法的。
int size=5;
int a[size];

如果想要在运行时通过输入大小来建立数组,可以使用malloc(C下)或者new(C++)来动态分配内存。
如:
int size;
int *a;
scanf("%d",&size);
a=(int*)malloc(sizeof(int)*size);
在C++下为
int size;
int *a;
cin>>size;
a= new int[size];

C. char[] v; 是不是说数组没设定长度。 但是数组是必须有长度的,何解

len = 10;
char[] v;
v = new int[len];属于数组的动态分配内存。
你不能这样做: int v[len];
编译器会报错说len的大小不能确定,因为用这种形式声明数组,数组的大小需要在编译时确定。

D. 在子函数中如果参数为数组,那么数组在定义时可以不指定大小吗为什么有时候说要必须指定数组大小!

数组在定义的时候必须指定大小,因为在ISO c++ 98标准中,数组是需要在程序堆上分配固定大小的空间,而之后不可更改。

数组作为函数参数的时候,实际只相当于传递一个数组首地址(和指针作用是一样的),而不是为数组分配空间,和实际声明定义的数组是有区别的,这个可以不指定大小。

E. C语言定义数组时必须要标明容量吗想要容量可变怎么办

因为编译器要为数组分配存储空间,所以一定要标明数组大小;
因为在程序内不能实现容量可变,所以定义数组时一般要预留够空间(C语言这方面也比较宽容,数组元素溢出一般不会报错);
想要容量可变要用别的数据结构~建议你学学链表等其他数据结构~
希望能够对你有帮助~

F. 编译原理:静态数组的存储空间可以在编译时确定。这句话为什么是错的。请给出详细原因,谢谢。

静态变量在程序运行过程中只在第一次初始化时,会赋初始值,以后即使再初始化其值也不会改变。
任何变量的存储空间及存储在内存中的位置都是由操作系统在程序运行时才分配的,只能说存储空间的大小是程序里面的初始化语句决定的。
静态变量、全局变量和局部变量
1.从作用域看:
C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:
全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
3>局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
4>静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
2.从分配内存空间看:
1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间
2>全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
1)全局变量、静态全局变量以及静态局部变量都会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它们与堆变量、堆变量的区别。
2)静态变量(包括静态局部变量和静态全局变量)用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。
Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

G. C语言定义数组一定要指定大小吗

是的,c中数组定义时要指定大小。
当然,万事也不是绝对的。例如:1.作为形参的时候,可以不指定,因为在函数调用的时候,数组会转为指针的。2.当为字符串数组时,char
ST[]="hello
word"这儿定义了一个ST字符数值,不需要你自己去指定大小,系统会自动生成长度为11.

H. 为什么数组要在编译期确定大小

从变成方面来看:定义一个数组是要用到数据类型的(byte,short,int,long,float,double,char)的, 而调用这些数据类型会在堆中建立该数组的对象,如果想要这个数组有值,那就一定会在数据区开区间,建立该对象的值。所以数组如果要有意义,编译期肯定要赋值。否则虽然不会报错,但莫名其面占用存储空间总归不好。

I. C++数组问题

1
float[]我没加a的时候是提示error C2133: 'f' : unknown size

定义float数组的时候,如果没有初始化,必须给出数组长度,不能为空。
如果给出初始化,编译器会自动分配长度,比如
float a[]={1,3};
这是可以的,编译器自动分配数组a的长度为2,并用1和3来初始化两个成员。

2
我加了a变成float【a】就提示error C2057: expected constant expression
: error C2466: cannot allocate an array of constant size 0
: error C2133: 'f' : unknown size

定义数组长度时必须用常量(也就是编译阶段就能知道具体值的量),
比如字面值常量5、20等,
或者是#define的常量,比如
#define MAX 10
float f[MAX]; // OK
或者是const常量,比如
const int Max = 10;
float f[Max]; // OK

总之定义数组,必须让编译器知道数组的长度,这样才能分配空间。

J. c语言:我想定义一个行数为n的数组,为什么还是告诉我不确定数组的大小怎么改急求!!!

你这么写的话,那个n还是一个变量,c语言首先需要编译才能执行,而编译的时候编译器就认为这个n是不确定的,所以他不知道要给你分配多大的存储空间,我建议你可以定义一个指针来做,下面是一个例子。
假设数组存的是int型
那么 你先申请10个元素
int* a = (int*)malloc(sizeof(int)*10);
如果又来了个元素,那么你就可以
a=(int *)realloc(a,11*sizeof(int));
求元素个数int i,n=1;
for(i = 0;(a+i)!=NULL;i++)
{
;
}
n=i+1;//n就是元素个数

阅读全文

与数组大小为什么必须在编译器确定相关的资料

热点内容
javaweb程序设计郭 浏览:235
gm声望命令 浏览:484
pdf转换器电脑版免费 浏览:41
解压歌曲什么歌最好 浏览:151
诺贝尔pdf 浏览:967
云服务器快速安装系统原理 浏览:788
苹果腾讯管家如何恢复加密相册 浏览:115
手机软件反编译教程 浏览:858
sqlserver编程语言 浏览:650
gpa国际标准算法 浏览:238
服务器编程语言排行 浏览:947
怎么下载快跑app 浏览:966
小红书app如何保存视频 浏览:170
如何解开系统加密文件 浏览:809
linux切换root命令 浏览:283
c编译之后界面一闪而过怎么办 浏览:880
怎么看ic卡是否加密 浏览:725
lgplc编程讲座 浏览:809
cnc手动编程铣圆 浏览:724
cad中几种命令的意思 浏览:327