1.数组下标访问越界
之前听到过,c和c++这两种语言相比其他语言更有效率,最近才理解应该是在于这种数组下标访问越界。我们都知道,一个长度为n的数组,其下标应该是从0到n-1。而如果出现了下标为n的情况,很明显发生了数组下标访问的越界。我们定义了几个变量和一个长度为5的数组,然后我们使用越界的下标访问数组,依照Windows的内存存放规则,我们来看一下内存图:
我们先定义的是j,然后是数组,接下来是i,但是通俗来讲,在Windows和Linux中的存储模式都是先定义出来的放在高地址处,并且相邻的元素存储会有8个字节的保护地址空间因此我们看到右边的内存数组的存放片区是在j之上的,我们越界赋值下标为5,6,7的几个元素。那么本来连着五块的内存空间,接下来本应该是2个4字节的保护地址空间,然后是j的空间。由于我们接着往下越界访问了下标5 6 7,那么很显然,a[5]和a[6]会覆盖掉之前两个字节的保护地址空间,紧接着a[7]会覆盖掉j的值,如图所示,j的值为22。因此,微软中出现数组的越界访问连续两次后,会造成数据错误访问。
2.数组的传参
很多时候我们需要编写函数,传入我们需要处理的数组进行处理。但是由于我们传入的数组,有时候数组元素的个数并不固定。那么这就需要我们对传来的数组的元素个数也进行传递。之前学习了sizeof这个运算符,用来计算对应变量类型的空间大小,那么可不可以在处理函数中也用sizeof对我们传入的数组计算元素个数呢?
有这样的一个思路,元素的个数=总空间大小/单个元素变量的空间大小,因此我们可以从0一直到元素的个数对数字遍历处理,如下图所示:
然而我们不难发现,sizeof(a)的值是4。因此我们需要注意,在传递数组参数的时候,不仅要把我们的数组传过去,还要传递我们数组的大小过去,这样我们才能对数组下标遍历处理。
3.字符数组的大小问题
大家知道,在c语言中,有很多类型是没有的,比如bool类型,比如string类型。而当我们使用c语言需要存存储字符串的时候,应该使用字符数组进行存储。而必须值得我们注意的是,字符数组的尾部都是有一个字符串的结束标记‘\0’,因此定义字符数组的时候,应该比原来的长度要大一点, 目的是给末尾的\0留空间。例如我们定义一个长度为5的字符数组存了三个字母how, 但实际上,这个字符数组的长度为是4,因为除了三个字母外,还有末尾的\0。