如何避免数组越界问题
一.什么是数组越界数组下标是从零开始。比如#includestdio.h int a[5] //合法下标只有01234如果访问a[5],此时就会越界这会导致程序逻辑混乱崩溃存在安全漏洞。二.数组越界的危险性会造成莫名其妙的bug,循环失效数据错乱堆栈破坏。数组越界在某些环境下会输出乱码另一些环境下直接崩溃。三.常见的越界场景1.循环下标写错int a[5]; for(inti0;i5;i){//i5会走到a[5]而数组只到a[4] a[i]0; }正确写法 int a[5]; for(inti0;i5;i){ a[i]0; } 2.使用变长数组int n; cinn; cina[n];//变长数组非标准写法易出错虽然Dev-cn能编译但大小不确定容易导致越界。可以改成vectorinta(n)//避免越界3.二维数组的行和列容易弄错int a[3][4]; for(int i0;i4;i){ for(int j0;j3;j){ //逻辑正确 } }for(int i0;i4;i){ for(int j0;j3;j){ //正常 } }两者都合法但有时候会出现循环范围写错而导致越界。4.字符串末尾容易忽略\0.在C语言中错误写法 char ch[4]abcd;//越界应该至少5个字节才行含\0 正确写法 char ch[5]abcd;四.如何彻底避免数组越界问题1.永远用长度不要用长度。2.统一用vector,避免变长数组vectorinta(n);优点-安全-不会溢出栈内存-更标准可移植。3.访问数组时做合理性检查if(idx0idxn){ a[idx]x; }尤其是在递归二分中。4.使用at()方法在C中a.at(idx);a[idx]不检查a.a(idx)会检查边界越界直接会报错调试的时候更容易发现错误。四.在算法竞赛中如何避免越界1.二分查找一定要保证leftright的逻辑正确错误实例 h(leftright)/2;//可能会溢出 正确 hleft(rightleft)/2;2.使用memset时注意字节大小memset(a,0,sizeof(a));仅对char数组安全对Int数组要确保长度正确。五.总结1.数组下标永远从0开始。2.访问必须满足0idxsize。3.vector是避免数组越界的最近工具。