程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C 語言數組越界問題

C 語言數組越界問題

編輯:關於C語言
 

今天又遇到如下問題,先看程序:

#define USERCOUNT 20
Action()
{
  char *filename="c:\\readme.txt";
  char *namecommon="people";
  char *passwordcommon="passwd";
  char username[20];
  char password[20];
  int i=0;
  long file;


  if((file=fopen(filename,"w+"))==NULL)
  {
   lr_error_message("Unable to Create %s",filename);
   return -1;
  }

  for(i=0;i<USERCOUNT;i++)
  {
   sprintf(username,"%s%d",namecommon,i);
    sprintf(password,"%s%d",passwordcommon,i);

   strcat(username," ");
   strcat(username,password);
   strcat(username,"\r\n");

   fwrite(username,strlen(username),1,file);
  
  }

  fclose(file);
  return 0;

}

打開結果文件:

people0 passwd0

people1 passwd1

people2 passwd2

people3 passwd3

people4 passwd4

people5 passwd5

people6 passwd6

people7 passwd7

people8 passwd8

people9 passwd9

people10 passwd10

people11 passwd11

people12 passwd12

people13 passwd13

people14 passwd14

people15 passwd15

people16 passwd16

people17 passwd17

people18 passwd18

people19 passwd19

程序按預期結果運行。

修改紅色標識部分char *passwordcommon="password";發現進入了死循環,強制停止運行,打開文件發現結果如下

people0 password0

people1 password1

people2 password2

people3 password3

people4 password4

people5 password5

people6 password6

people7 password7

people8 password8

people9 password9

people10 password10

people11 password11

people11 password11

people11 password11

people11 password11

.................................

現象:程序進入死循環,變量i始終為10,不再按預先設計遞增。

原因分析:  數組username[20],長度為20個字節,程序將‘用戶名’+‘空格’+‘密碼’+‘回車換行’組合到一起放入到數組username中,當i增長到10時,生成字符數組people11 password11(注意:緊挨著\r\n),其長度是21個字節,放入數組username中時超出了20個字節的界限,\n替代了i,\n的數值=10,然後每次循環i均等於10,所以導致了死循環。

 

以下是轉載的:

大家都知道,在C語言中一般是不會檢查數組的下標范圍的,這樣的好處是給了程序員很大的靈活性,更宜於寫出高效的代碼。如果定義一個數組a[n],其有效下標范圍為0 - (n-1),但你要引用下標n,編譯器一般是不提示錯誤的,但是這樣也潛在的隱含著一些隱患。
請看如下語句:(32位機器上)
#include <stdio.h>
int main(void)
{
    int i;
    int a[3] = {1, 2, 3};
   
    for (i = 1; i <= 3; i++)
    {
        a = 0;
    }
    return(0);
}
現在我們假設計算機分配給變量i內存位置為0022FF5C
數組a中各元素所分配的內存位置如下:
a[0]地址:0022FF50
a[1]地址:0022FF54
a[2]地址:0022FF58
請看for()循環:
i = 1時,把a[1]置0。i自加一次變為2,把a[2]置0。i再自加變為3。
注意了!!!
當i變為3時,程序將找到數組元素a[3]所在的內存位置(即本例中分配給變量i的內存單元0022FF5C),並寫入0,從而導致變量i值為0。接著到for()循環中去判斷條件 i <= 3,因為i的值剛才被置為0,i <= 3成立,導致再次開始執行循環。
就後程序將陷入死循環。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved