C语言为何不自动验证数组下标越界?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1264个文字,预计阅读时间需要6分钟。
1、引言+最近发现一个bug,发现是数组越界导致的。数组只有30个字节,代码却向这个数组填充了35个数据,这个bug还是偶然发现的,查到它竟然实现了一项功能。我忽然想到:C语言...
1、引言最近在查一个bug,查到最后发现是数组越界导致的。数组只有30个字节,代码却向这个数组填充了35个数据,这个bug还是偶现的,查到它确实废了一番功夫。我就突然想到:C语言为什么不检查数组下标呢???先来个demo验证下
#include<stdio.h> #include<stdlib.h> int main() { int data[5]={0}; for(int i=0;i<8;++i) { printf("%d ",data[i]); } printf("\n"); return 0; }
结果显示,C语言还真的不检查数组的下标。不仅没有报错,而且运行正常
2、思考这就让我陷入了思考,C语言为什么不检查下标呢?想上文这么简单的,data数据组就5个数据,编译器是知道的,为什么是访问第8个数据时,编译器来个报错也没有呢?我想到了之前的文章《指针与数组》中有如下示例代码:
void main() { int data[4] = {0, 1, 2, 3}; int *p; p = data +2; printf("p[-1] is %d\n",p[-1]); printf("*(p-1) is %d\n",*(p-1)); }
运行结果如下
不仅可以编译通过,还能正确的输出结果为1。这表明,C的下标引用和间接访问表达式是一样的。
本文共计1264个文字,预计阅读时间需要6分钟。
1、引言+最近发现一个bug,发现是数组越界导致的。数组只有30个字节,代码却向这个数组填充了35个数据,这个bug还是偶然发现的,查到它竟然实现了一项功能。我忽然想到:C语言...
1、引言最近在查一个bug,查到最后发现是数组越界导致的。数组只有30个字节,代码却向这个数组填充了35个数据,这个bug还是偶现的,查到它确实废了一番功夫。我就突然想到:C语言为什么不检查数组下标呢???先来个demo验证下
#include<stdio.h> #include<stdlib.h> int main() { int data[5]={0}; for(int i=0;i<8;++i) { printf("%d ",data[i]); } printf("\n"); return 0; }
结果显示,C语言还真的不检查数组的下标。不仅没有报错,而且运行正常
2、思考这就让我陷入了思考,C语言为什么不检查下标呢?想上文这么简单的,data数据组就5个数据,编译器是知道的,为什么是访问第8个数据时,编译器来个报错也没有呢?我想到了之前的文章《指针与数组》中有如下示例代码:
void main() { int data[4] = {0, 1, 2, 3}; int *p; p = data +2; printf("p[-1] is %d\n",p[-1]); printf("*(p-1) is %d\n",*(p-1)); }
运行结果如下
不仅可以编译通过,还能正确的输出结果为1。这表明,C的下标引用和间接访问表达式是一样的。

