簡體   English   中英

C程序中的數組

[英]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 |
+------+------+------+----+

ba[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM