導航:首頁 > 源碼編譯 > 數組大小為什麼必須在編譯器確定

數組大小為什麼必須在編譯器確定

發布時間: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就是元素個數

閱讀全文

與數組大小為什麼必須在編譯器確定相關的資料

熱點內容
編譯原理如何運用到編程中 瀏覽:14
linux選擇資料庫 瀏覽:375
php兩個數組差集 瀏覽:978
迷你pdf閱讀器下載 瀏覽:432
做一個python小程序 瀏覽:654
pythonossystem和 瀏覽:644
win2008如何搭建ftp伺服器 瀏覽:53
安卓手機為什麼不翻牌 瀏覽:545
刪除pkpm及相關文件夾 瀏覽:480
房貸解壓銀行內部流程 瀏覽:734
安卓手機如何更改語音 瀏覽:599
android紅包實現 瀏覽:733
蘋果的nvme為什麼安卓不用 瀏覽:31
python輸入單詞統計個數 瀏覽:997
腳本軟體提取源碼 瀏覽:281
程序員能給自己的微信錢包刷錢么 瀏覽:72
怎麼讓小天才app查看寶貝的通訊錄 瀏覽:623
dxgpdf 瀏覽:257
哪個命令 瀏覽:51
文件不能打包壓縮 瀏覽:708