C語言數(shù)組越界了,后果很嚴(yán)重,如何避免?
數(shù)組下標(biāo)取值越界
1int a[3]; 2int i=0; 3for(i=0;i<4;i++) 4{ 5 a[i] = i; 6} 7for(i=0;i<4;i++) 8{ 9 printf("a[%d]=%d\n",i,a[i]); 10}
1int a[3]; 2int i=0; 3for(i=0;i<3;i++) 4{ 5 a[i] = i; 6} 7for(i=0;i<3;i++) 8{ 9 printf("a[%d]=%d\n",i,a[i]); 10}
指向數(shù)組的指針的指向范圍越界
1int i; 2int *p; 3int a[5]; 4/*數(shù)組a的頭指針賦值給指針p*/ 5p=a; 6for(i=0;i<10;i++) 7{ 8 /*指針p指向的變量*/ 9 *p=i+10; 10 /*指針p下一個(gè)變量*/ 11 p++; 12}
1int i; 2int *p; 3int a[5]; 4/*數(shù)組a的頭指針賦值給指針p*/ 5p=a; 6for(i=0;i<5;i++) 7{ 8 /*指針p指向的變量*/ 9 *p=i+10; 10 /*指針p下一個(gè)變量*/ 11 p++; 12}
1#define PASSWORD "123456" 2int Test(char *str) 3{ 4 int flag; 5 char buffer[7]; 6 flag=strcmp(str,PASSWORD); 7 strcpy(buffer,str); 8 return flag; 9} 10int main(void) 11{ 12 int flag=0; 13 char str[1024]; 14 while(1) 15 { 16 printf("請(qǐng)輸入密碼: "); 17 scanf("%s",str); 18 flag = Test(str); 19 if(flag) 20 { 21 printf("密碼錯(cuò)誤!\n"); 22 } 23 else 24 { 25 printf("密碼正確!\n"); 26 } 27 } 28 return 0; 29}
1請(qǐng)輸入密碼:12345 2密碼錯(cuò)誤! 3請(qǐng)輸入密碼:123456 4密碼正確! 5請(qǐng)輸入密碼:1234567 6密碼正確! 7請(qǐng)輸入密碼:aaaaaaa 8密碼正確! 9請(qǐng)輸入密碼:0123456 10密碼錯(cuò)誤! 11請(qǐng)輸入密碼:
盡量顯式地指定數(shù)組的邊界
1int a[]={1,2,3,4,5,6,7,8,9,10};
1int a[10]={1,2,3,4,5,6,7,8,9,10};
1#define MAX 10 2… 3int a[MAX]={1,2,3,4,5,6,7,8,9,10};
1int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10};
1#define MAX 10 2#define MAX1 15 3#define MAX2 6 4int main(void) 5{ 6 int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10}; 7 int b[MAX1]={1,2,3,4,5,[MAX1-5]=6,7,8,9,10}; 8 int c[MAX2]={1,2,3,4,5,[MAX2-5]=6,7,8,9,10}; 9 int i=0; 10 int j=0; 11 int z=0; 12 printf("a[MAX]:\n"); 13 for(i=0;i14 { 15 printf("a[%d]=%d ",i,a[i]); 16 } 17 printf("\nb[MAX1]:\n"); 18 for(j=0;j19 { 20 printf("b[%d]=%d ",j,b[j]); 21 } 22 printf("\nc[MAX2]:\n"); 23 for(z=0;z 24 { 25 printf("c[%d]=%d ",z,c[z]); 26 } 27 printf("\n"); 28 return 0; 29}
1a[MAX]: 2a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 a[5]=6 a[6]=7 a[7]=8 a[8]=9 a[9]=10 3b[MAX1]: 4b[0]=1 b[1]=2 b[2]=3 b[3]=4 b[4]=5 b[5]=0 b[6]=0 b[7]=0 b[8]=0 b[9]=0 b[10]=6 b[11]=7 b[12]=8 b[13]=9 b[14]=10 5c[MAX2]: 6c[0]=1 c[1]=6 c[2]=7 c[3]=8 c[4]=9 c[5]=10
對(duì)數(shù)組做越界檢查,確保索引值位于合法的范圍之內(nèi)
1#define ARRAY_NUM 10 2int *TestArray(int num,int value) 3{ 4 int *arr=NULL; 5 arr=(int *)malloc(sizeof(int)*ARRAY_NUM); 6 if(arr!=NULL) 7 { 8 arr[num]=value; 9 } 10 else 11 { 12 /*處理arr==NULL*/ 13 } 14 return arr; 15}
1int *TestArray(int num,int value) 2{ 3 int *arr=NULL; 4 /*越界檢查(越上界)*/ 5 if(num6 { 7 arr=(int *)malloc(sizeof(int)*ARRAY_NUM); 8 if(arr!=NULL) 9 { 10 arr[num]=value; 11 } 12 else 13 { 14 /*處理arr==NULL*/ 15 } 16 } 17 return arr; 18}
1if(num>=0&&num2 { 3}
1int *TestArray(size_t num,int value) 2{ 3 int *arr=NULL; 4 /*越界檢查(越上界)*/ 5 if(num6 { 7 arr=(int *)malloc(sizeof(int)*ARRAY_NUM); 8 if(arr!=NULL) 9 { 10 arr[num]=value; 11 } 12 else 13 { 14 /*處理arr==NULL*/ 15 } 16 } 17 return arr; 18}
獲取數(shù)組的長(zhǎng)度時(shí)不要對(duì)指針應(yīng)用 sizeof 操作符
1/*若此時(shí)max定義為intmax();*/ 2sizeof(max) 3/*若此時(shí)arr定義為char arr[MAX],且MAX未知*/ 4sizeof(arr) 5/*不能夠用于void類型*/ 6sizeof(void) 7/*不能夠用于位字段*/ 8struct S 9{ 10 unsigned int f1 : 1; 11 unsigned int f2 : 5; 12 unsigned int f3 : 12; 13}; 14sizeof(S.f1);
1void Init(int arr[]) 2{ 3 size_t i=0; 4 for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++) 5 { 6 arr[i]=i; 7 } 8} 9int main(void) 10{ 11 int i=0; 12 int a[10]; 13 Init(a); 14 for(i=0;i<10;i++) 15 { 16 printf("%d\n",a[i]); 17 } 18 return 0; 19}
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!