今天又遇到如下問題,先看程序:
#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成立,導致再次開始執行循環。
就後程序將陷入死循環。