[英]Arrays in C program
這是我的C程序代碼:
#include<stdio.h>
unsigned int count = 1;
int main(void)
{
int b = 10;
int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
printf("\n b = %d \n",b);
a[3] = 12;
printf("\n b = %d \n",b);
return 0;
}
和輸出為
b=10
b=12
任何人都可以解釋它的原因以及錯誤背后的原因。
您正在寫超出數組范圍的內容。 這將調用未定義的行為 。
您正在以a[3] = 12;
書寫a[3] = 12;
到一個越界索引UB,由於它的UB意味着任何事情都可能發生,所以您可能剛剛覆蓋了a[3]
的值,即b
的位置。
您的程序具有未定義的行為 。 根據您的結果,您的記憶看起來像這樣:
a[0] a[1] a[2] b
+------+------+------+----+
| 1 | 2 | 3 | 12 |
+------+------+------+----+
b
與a[3]
相同,因為它在內存中“坐在”它的旁邊。
這只是一種可能的情況,您的程序可能會出現“分段錯誤”或其他任何情況。
這是因為您正在訪問a[3]
,這是第4個元素,但是您僅定義了一個大小為3的數組。結果,您將獲得一個指向垃圾數據的指針,該指針恰好指向了內存的內存位置。 b
。 因此,當您分配a[3]
,您就是在分配b
的存儲位置:
#include<stdio.h>
unsigned int count = 1;
int main(void)
{
int b = 10;
int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
printf("\n b = %d \n",b);
a[3] = 12;
printf("\n b = %d \n",b);
return 0;
}
指針存儲位置指向a[3]
和b
:
b = 10
a[3]:0xa
b:0xa
b = 12
現在嘗試實際創建一個包含四個元素的數組。 將a[3]
更改為a[4]
,以便a[3]
不是垃圾位置。 您會看到它的工作原理。
所謂的“未定義行為”可以包括多種行為。 其中包括:
您在這里擁有后者:變量b
恰好在數組之后,直接在內存中,因此由於這種錯誤的訪問而對其進行了修改。
也許您可以定義一個指向a [3]地址的指針,然后輸出它。 然后,您將知道答案。
因為如果您同時打印變量b和a [3]的地址,
printf("%u",&b);
printf("\n %u",&a[3]);
然后它為兩個變量地址提供相同的輸出
您的程序導致未定義的行為,此處的答案解釋了此“未定義的行為”,試圖使輸出具有某些含義,但並不總是如此。 實際上,我嘗試運行您的程序,我可以看到b在兩個printf中都打印了10,最后我得到運行時錯誤(我使用了Visual Studio 2010)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.