数组下标越界居然不出段错误???
#include <stdio.h>
int
main (int argc, char **argv)
{
int pos = -100;
char c[7];
c[pos] = 'a ';
putchar (c[pos]);
putchar ( '\n ');
}
如此能够正确执行而不出内存访问的错误
把pos改为10000居然也安然无恙
到底有没有王法?
[解决办法]
VC和TC下也”不会有任何问题“。
对于大程序来说,如果存在这样的语句,那就等于是一个定时炸弹
[解决办法]
#include <stdio.h>
int
main (int argc, char **argv)
{
int pos = -100;
char *c;
c=(char *)malloc(7);
c[pos] = 'a ';
putchar (c[pos]);
putchar ( '\n ');
}
//看看上面的情况会不会出段错误.
出段错误也是蛮容易的
[解决办法]
访问如此不着边际的地方而没出错,是不是凑巧了?
---------------------------------------------------
只是该地方已经被申请了,而且不会影响程序的执行,所以没有出错
如果这两个条件不满足,肯定会出错
[解决办法]
int
main (int argc, char **argv)
{
int pos = -100;
char *c;
c=(char *)malloc(7);
c[pos] = 'a ';
putchar (c[pos]);
putchar ( '\n ');
}
//看看上面的情况会不会出段错误.
出段错误也是蛮容易的
/////////////////////??
这个堆的程序比哪个栈的更不容易出现段错误
[解决办法]
C\C++语言没有对访问越界检查的责任,这个我们在初学这们语言时就应该注意到。语言认为这是我们(C\C++程序员)的责任!如果你不喜欢这点,可以选择别的语言,VB就有越界检查。但你决不要对访问越界有侥幸心理,你上面的代码绝非你所谓的“安然无恙”,你之所以有这种感觉,只是因为你的程序规模小,你越界的地方侥幸在一个“安全”的地址空间。但作为C\C++程序员一定不能有这样的侥幸心理,这正是我们不同于其它语言程序员的地方。
[解决办法]
有的时候就是利用这种下标越界的方式来实现一些功能。
考虑有一个data buffer,第一个int是类型,后面的数据结构内容根据类型不同而不同。
struct Header
{
int data_type;
char data[];
};
struct data_A_struct
{
int a;
int b
int content;
int c;
};
struct data_B_struct
{
int content;
int b;
int c;
};
void parse_data(char * data)
{
int content;
char * data_ptr;
data_ptr=(struct Header *)data-> data;
switch((struct Header*)data-> data_type)
{
case DATA_A_TYPE:
content=(struct data_A_struct *)data_ptr-> content;
break;
case Data_B_TYPE:
content=(struct data_B_struct *)data_ptr-> content;
break;
}
}
随便写的代码,不晓得有没有把意思表达清楚。
------解决方案--------------------
数组越界的例子:
int main(int argc, char* argv[])
{
int i;
int a[16];
for(i=0;i <=16;i++)
{
a[i]=0;
printf( "%d ",i);
}
return 0;
}
a[16]就是i地址,所有到了16的时候 i又成了0,就这样无限循环下去了 0 1 2 3 4 .....15 0 1 2...15 0....
死循环,没有越界的检查.