C语言数组越界了,后果很严重,如何避免?
扫描二维码
随时随地手机看文章
数组下标取值越界
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}
指向数组的指针的指向范围越界
1int i; 2int *p; 3int a[5]; 4/*数组a的头指针赋值给指针p*/ 5p=a; 6for(i=0;i<10;i++) 7{ 8 /*指针p指向的变量*/ 9 *p=i+10; 10 /*指针p下一个变量*/ 11 p++; 12}
1int i; 2int *p; 3int a[5]; 4/*数组a的头指针赋值给指针p*/ 5p=a; 6for(i=0;i<5;i++) 7{ 8 /*指针p指向的变量*/ 9 *p=i+10; 10 /*指针p下一个变量*/ 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("请输入密码: "); 17 scanf("%s",str); 18 flag = Test(str); 19 if(flag) 20 { 21 printf("密码错误!\n"); 22 } 23 else 24 { 25 printf("密码正确!\n"); 26 } 27 } 28 return 0; 29}
1请输入密码:12345 2密码错误! 3请输入密码:123456 4密码正确! 5请输入密码:1234567 6密码正确! 7请输入密码:aaaaaaa 8密码正确! 9请输入密码:0123456 10密码错误! 11请输入密码:
尽量显式地指定数组的边界
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
对数组做越界检查,确保索引值位于合法的范围之内
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}
获取数组的长度时不要对指针应用 sizeof 操作符
1/*若此时max定义为intmax();*/ 2sizeof(max) 3/*若此时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}
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!