當前位置:首頁 » 編程語言 » C語言數組沒有邊界限定
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

C語言數組沒有邊界限定

發布時間: 2022-08-10 16:22:48

『壹』 c語言中,數組定義時下標有范圍限定嗎

理論上是沒有的,我們一般也不會定義特別大,至於會不會因為定義得特別大而超出計算機內存,我沒有試過,不知道~

『貳』 C語言數組,我沒有越界啊,怎麼這樣help!

int x[2]; // x包含2個元素 x[0] x[1]
x[2] = getchar(); // 沒有x[2] 此處越界了

『叄』 C語言數組問題

你的描述:給出首地址,按照順序一直存下去

C語言室不檢查數組邊界的
這就是c的特點:短小,速度快,把自由度全部給程序員。

其實如果對數組邊界進行檢查的語言多的是,你如果需要可以換一個語言。
《陷阱》書上把c比喻成「菜刀」(見過2、3本比喻成「刀」),問你如果為了避免切到自己的手,會否加上一個保護裝置?

『肆』 c語言問題,請求解答

char[5]在定義時是分配了5個位元組的地址。這5個後面是存別的變數的地址,也可能沒有被分配走,是個無用的地址。輸入的超過5個後,就會連著存在後面的地址里。輸出時,只是給出字元串的首地址,輸到'\0'之前就結束。char[5]裡面輸出後,再到 char[6] 裡面就是超出的 '\0'
有時會有問題,是因為,後面那個地址里值,被別的地方改掉了,不是'\0' 它就會一直連著輸出。直到後面某一個地址里遇到 '\0'才會停。

『伍』 C語言二維數組與越界的問題

對於數組a[M][N],其索引范圍是a[0][0]~a[M - 1][N - 1],所以循環變數取值i = 1;i <= M和j = 1; j <=N是錯誤的,應該改為i = 0; i < M和j = 0. j < N;。這就是你代碼出現越界錯誤的根源。另外,if(i = 1 != 0 &&...也是錯誤的,應該改為if(i == 1 $$ i != 0 && ...),(這里的$$ 應根據你的具體需要替換為&&或||)。

『陸』 C語言指針問題

你要透徹理解這里的問題,需要理解數組,指針以及數組與指針的關系。你可以找本C語言的書好好看看,我先幫你分析下這里的問題。

int *p[4];
聲明了一個數組,數組有4個元素,每個元素的類型是int指針。
即p可以保存4個int指針,即p[0],p[1],p[2],p[3]都是指針。

#include"stdio.h"
main()
{
int x[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},*p[4],i;
for(i=0;i<4;i++)
{
p[i]=&x[2*i+1]; /* 將x[2*i+1]的地址分別存儲p[i] */
/* 四次循環後p[0] p[1] p[2] p[3]分別為x[1] x[3] x[5] x[7]的地址 */
/* 也就是*p[0] *p[1] *p[2] *p[3] 的值為2,4,6,8 (x[1] x[3] x[5] x[7])*/
printf("%d",p[i][0]);/* 這里數組和指針的轉換,數組的本質也是指針 */
/* p[i]是指針,也可以看成是一個4*1的二維數即 *(p[i]+0) 等價於 p[i][0] */
/* *(p[i]+0) 去掉0 即 *p[i] 所以答案很明顯 */
}
printf("\n");
}

第二題
#include"stdio.h"
main()
{
int x[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},*p[4],i;
for(i=0;i<4;i++)
{
p[i]=&x[2*i+1];/* 這之前與上一題相同 */
printf("%d",p[0][i]);
/* p可以看成是一個1*4(上題是4*1)的二維數即 *(p[0]+i) 等價於 p[0][i] */
/* 所以是p[0]地址即其後的連續4個地址 所以輸出 2,3,4,5 */
/* 而上題輸出的四個值的地址是不連續的,分別是x[1] x[3] x[5] x[7]的地址*/
}
printf("\n");
}

你需要找本書看看數組的本質,其實C語言從語法來說是沒有二維數組的,如int p[i][j]其實是一個有i個元素的數組,而每個元素中又含有j個int類型元素的數組。其本質是數組的數組,而不是二維數組。

PS: 上面4*1和1*4中維數是假設你可以看成是任何維數的數組,因為C語言中的數組是沒有邊界的,超出邊界只會引起非法內存訪問,而不會引起語法錯誤。
這里的假設都是合法的假設,用於說明問題

『柒』 C語言為什麼不執行數組邊界的有效性檢查

沒有對指針類型的數據進行訪問區域的約束。
這種約束沒有什麼必要,而且實現起來比較麻煩,類似於內存的許可權管理,一般更加復雜的系統比如操作系統才進行這樣的決策處理。

『捌』 c語言字元串數組

字元串是連續的字元序列,最後以空字元'\0'作為終止符。一個字元串的長度指所有字元的數量,但不包括終止符。在 C 語言中,沒有字元串類型,自然也就沒有運算符以字元串為操作數。

字元串被存儲在元素類型為 char 或寬字元類型數組中(寬字元類型指 wchar_t、char16_t 或 char32_t)。寬字元組成的字元串也稱為寬字元串(wide string)。

C 標准庫提供了大量的函數,它們可以對字元串進行基本操作,例如字元串的比較、復制和連接等。在這些傳統的字元串函數以外,C11 新增了這些函數的「安全」版本,它們能確保字元串操作不會超出數組的邊界。

可以使用字元串字面量來初始化任何字元類型數組。

『玖』 C語言聲明數組必須要設定范圍

知道錯 你知道為什麼>>>??????????

int num[i][j] 首先編譯程序告訴你 沒有聲明的兩個變數
i j對吧 程序不對 所以 它不能這樣寫

還有i j就算定義了 沒值 不確定句不能確定num數組的大小
計算機很苯的 就認為它很大 那這么辦 就是無限的大啊
向內存申請了 很大很大的空間 然後四機了

也說明 不能這樣寫

其實在書上已經寫的很明白了 數組的聲明可以怎麼樣
不可以怎麼樣 我只是 反向的解釋下
希望有幫助