一个隐蔽的数组访问越界的问题(竟然纠结半小时,有可能是我水平太低了)

代码简化如下:

#include <iostream>

#include <string>

using namespace std;

int main()

{

string str="Hello World!";

int len = str.length();//获取长度

for(int i=0;str[i]!=‘ ‘&&(i<len);++i);//遍历字符串中的每一个变量知道找到空格  就是在这一行调试时总是出现错误,原因是数组访问越界

......

}

红色一行的确越界了,原因是每次执行for内的判定条件时,先执行的 str[i]!=‘ ‘ ,这里就一定会发生越界。

要想不越界,可调换顺序 for(int i=0;(i<len)&&str[i]!=‘ ‘;++i)就可以了。

没想到这么小的问题,纠结了半个小时,所以写下来,加深印象,以期养成良好的代码习惯。

时间: 2024-10-12 22:56:24

一个隐蔽的数组访问越界的问题(竟然纠结半小时,有可能是我水平太低了)的相关文章

shell if判断(曾经被一个字符串相等的判断纠结半小时,最后只是if后少了个空格!) 和 awk引用外部变量判断

一.if判断 数字: $A=12 $B=15 if(("$A"<"$B")) if(("$A"=="$B")) 字符串: $A="HELLO" $B="WORLD" if [ "$A" = "FACT_LOGIN_USER" ] if [ "$A" = "$B" ] PS:字符串比较的时候注意 'if'

离奇错误 数组访问越界

class OwnerImage { public: CSize GetImageSize(); private: POINT m_pt[2]; int m_iImgWidth; int m_iImgHeight; } CSize OwnerImage::GetImageSize() { return CSize(m_iImgWidth, m_iImgHeight); } 其余函数省略了,在不断调用GetImageSize函数过程中,m_iImgWidth大小会发生变化,最初以为是CSize构造

动态数组索引越界问题

1.在C++中,可以采用几种不同的方法创建一个某种类型T的对象的数组.3种常用的方法如下: #define N 10 //数组的长度N在编译时已知 T static_array[10]; int n = 20; //数组的长度n是在运行时计算的 T* dynamic_array = new T[n]; std::vector<T> vector_array; //数组的长度可以在运行时进行修改 当然,我们仍然可以使用calloc()和malloc()函数,并且这样的程序仍然能够通过编译并顺利运

一个简单的指针访问错误

对于几乎没什么工程经验的我来说,找个印象深刻的bug也是一件很难的事情啊.下面还是刚刚接触C语言时候犯过的一个错误, 刚刚接触指针,写了一段代码,通过指针int * pa访问动态数组int *a = (int *)malloc(sizeof(int)*2). 初始化pa = a; 写了个循环遍历数组时,不想通过下标来访问,而是通过加循环索引idx来遍历,每次循环pa = pa + idx;idx初始化为0,每次循环idx++ for(idx=0;idx<2;idx++){ pa = pa+idx

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

new一个二维数组(转)

转自:http://www.cnblogs.com/irvinow/archive/2009/02/21/1395340.html 定义二维数组char array[x][y]; 1.只定义个一维的就可以了 char *array; array = new char[x*y]; 访问的时候*(array+i*y+j)表示array[i][j] 2.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] =

判断一个变量是数组类型的方法

在很多时候,我们都需要对一个变量进行数组类型的判断(借鉴) 学过js就应该知道typeof运算符返回字符串,该字符串代表操作数的类型(即返回数据类型)这是最常用的. 下面多种实现方式: JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Array的对象就不起作用了. alert(typeof null); // "object" alert(ty

螺旋式打印一个二维数组

问题描述:螺旋式打印一个二维数组.如 1     16     3     2     17 8     6       4     3     23 2     5       7     8     12 21   2       4     6     13 要求打印后顺序为: 1     16   3     2     17   23     12     13   6     4     2     21     2     8   6     4     3     8     7

内存泄露与内存访问越界

内存泄露 在堆上分配的内存,没有及时释放掉,以便后面其它地方可以重用.在C/C++中,内存管理器不会帮你自动回收不再使用的内存.如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露. 一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃. 内存访问越界,使用的内存 超出了 向系统申请了一块内存,覆盖该空间之后的一段存储区域,导致系统异常. 常见原因: 1 写越界,又叫缓冲