在C++中,偶们经常遇到数组越界的问题,为什么编译器在build的过程中,不能识别出这样的错误呢?其实在C++的编译器语言里,根本就不存在所谓的数组的类型。当偶们定义了一个数组后,编译器直接将这个数组类型隐式转换为了指针类型,所以,在编译器的语言里,自然也不存在所谓的“数组越界”了。
偶们来看下面一段代码:
long a[4];
long *p = a;
1[p] = 5;
p[1];
a[1];
可以看到,p[1] = a[1] = 5.
也就是说:
1、定义a数组的时候,a数组自动转换成指针类型,相当于连续定义了4个long指针的效果。所以当使用指针P将a数组的地址读取出来以后,就可以使用指针p来对地址内空间进行赋值了。
2、[]运算符并不是专门的数组的运算符,它要求的格式是:<num1>[<num2>]。
其意义也等同于:
*(<num1>+<num2>)
换个说法,数组也就是很单纯的将两个指针类型的数字进行加法操作,然后再通过*操作符转换成引用类型的数字而已。
所以,偶们在数组运算中,出现的溢出错误:
long a[4];
a[4] = 5;
C++编译器只是简单认为就是一个指针赋值,因此不会对数组越界进行错误检测。
偶们来看下面一段代码:
long a[4];
long *p = a;
1[p] = 5;
p[1];
a[1];
可以看到,p[1] = a[1] = 5.
也就是说:
1、定义a数组的时候,a数组自动转换成指针类型,相当于连续定义了4个long指针的效果。所以当使用指针P将a数组的地址读取出来以后,就可以使用指针p来对地址内空间进行赋值了。
2、[]运算符并不是专门的数组的运算符,它要求的格式是:<num1>[<num2>]。
其意义也等同于:
*(<num1>+<num2>)
换个说法,数组也就是很单纯的将两个指针类型的数字进行加法操作,然后再通过*操作符转换成引用类型的数字而已。
所以,偶们在数组运算中,出现的溢出错误:
long a[4];
a[4] = 5;
C++编译器只是简单认为就是一个指针赋值,因此不会对数组越界进行错误检测。