首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数组下标越界居然不出段异常?

2012-02-23 
数组下标越界居然不出段错误???#includestdio.hintmain(intargc,char**argv){intpos-100charc[7]c[po

数组下标越界居然不出段错误???
#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....
死循环,没有越界的检查.

热点排行