查看單個文章
  #20  
舊 2014-02-06, 04:38 PM
哈啦 的頭像
哈啦 哈啦 目前離線
論壇管理員
 
註冊日期: 2002-05-28
文章: 23,016
預設

繼續請教高手:
以下的式子是要把陣列a1的數值複製給陣列a2。

課本上的標準寫法如下:
引用:
#include <stdio.h>

int main(void)
{

int i,a1[10],a2[10];

for(i=1;i<11;i++) a1[i-1]=i;
for(i=0;i<10;i++) a2[i]=a1[i];
for(i=0;i<10;i++) printf("%d\n",a2[i]);

return 0;
}
而我看了yumi剛才的寫法後獲得啟發,也改寫為如下:
引用:
#include <stdio.h>

int main(void)
{

int i,a1[10],a2[10];

for(i=1;i<11;i++){
a1[i-1]=i;
a2[i]=a1[i-1];
printf("%d\n",a2[i]);}
return 0;
}
這二者跑出來的結果都是一樣的,看似我改寫的也頗為正確,不過我自己懷疑第二個式子中有不可見的錯誤存在?(編譯器未發出警告),就是紅字部份的a2[i]=a1[i-1],它等於是a2陣列的第一個是從a2[1]啟始,前面的a2[0]並未被賦值,這一點不打緊,但由於a2[10]之前已宣告為只有十個元素,因此這裡最後會一路被加到a[10]而這是第十一個元素,超過了原先只能有十個元素的宣告。看網路上說,
引用:
C/C++ 為了執行效率,並不會自動檢查陣列索引值是否超過陣列邊界,
我們要自己寫程式來確保不會越界。一旦越界,將導致無法預期的後果。
因此我的疑問如下,我這改寫的式子雖然答案是ok的,但它式子本身應是錯的,是嗎?
其次,陣列元素超過原來宣告的數目,未必一定會造成錯誤,就是說有可能有影響也有可能沒影響,所謂的導致無法預期的後果?是這樣嗎?
我有試著把a2[i]=a1[i-1]改成
a2[i-1]=a1[i-1] 或者
a2[i]=a1[i]
結果答案出來全都亂七八糟。
請問正確的改寫法該是什麼呢?

唔該先。
__________________
咖啡走路
微博


您是網站站長嗎?歡迎到站長俱樂部 一起討論吧。
按我看版規
code.club
回覆時引用此篇文章