由数组下标越界引起的几个小问题(C语言)
由数组下标越界引起的几个问题(C语言)
"此算法的功能是:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。"这是我在论坛里看到的一个帖子,我的解答如下:
#include<stdio.h>
#include<conio.h>
void main()
{
int a[8]={1,2,3,4,6,7,8,9};
int b[9];
int flag,number;
flag=1;
printf("number=");
scanf("%d",&number);
for(int i=0;i<9;i++)
{
if(flag==1&&a[i]<number) //flag作为标记,看是否已经将输入的数插入
b[i]=a[i]; //i等于8时,对a越界
else
{
b[i]=number;
number=a[i];
flag=0;
}
}
for(int j=0;j<9;j++)
printf("%4d",b[j]);
printf("\n%d ",a[10]); //检验输出代码
getchar();
}
上面的if语句中,i等于8时越界(对a),但结果并没有错,即使输入的数比9大也一样。在加入的那行检验输出代码,发现a[8]为1245128,所以结果正确。记得好像越界时数字是随机产生,所以,更改了几次输出,如a[9](等于4200217),a[10](等于1)后,又发现了一个问题,即a[8],a[9],a[10]值不会改变,我是说,即使重新编译也一样,还有,我又将上面的程序代码COPY下来,然后将刚才生成的相关文件全部删除,再建了一个工作区将代码拷过去,结果仍然一样,a[8]还是1245128,a[9]是4200127,a[10]还是1。向各位大侠请教一下,对下标越界后的值到底是怎么处理的??既然是随机产生的话,为何几次编译得到的值并没有改变??
我用的是MSDEV98,对C了解还不是很多,拜托各位了
------解决方案--------------------
这里说的随机并不是指每次不一样.而是是什么值都有可能.如果越界读写可能读写到其他变量/对象的数据,还可能破坏代码.
------解决方案--------------------
越界以后可能发生的事情谁都不知道,具体牵涉到编译器如何安排还有操作系统的问题还有机器的问题,一般栈上的越界通常被用来实现所谓的“缓存区溢出攻击”,LZ可以找些资料看一下
但是永远不要相信越界操作的结果
------解决方案--------------------
越界也有一个内存地址,只是那个内存地址可能存了别的东西,不属于你.但是你非要抢来用,也是可以的.
只是..你不要抢政府的地,否则让你的机子挂掉
"此算法的功能是:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。"这是我在论坛里看到的一个帖子,我的解答如下:
#include<stdio.h>
#include<conio.h>
void main()
{
int a[8]={1,2,3,4,6,7,8,9};
int b[9];
int flag,number;
flag=1;
printf("number=");
scanf("%d",&number);
for(int i=0;i<9;i++)
{
if(flag==1&&a[i]<number) //flag作为标记,看是否已经将输入的数插入
b[i]=a[i]; //i等于8时,对a越界
else
{
b[i]=number;
number=a[i];
flag=0;
}
}
for(int j=0;j<9;j++)
printf("%4d",b[j]);
printf("\n%d ",a[10]); //检验输出代码
getchar();
}
上面的if语句中,i等于8时越界(对a),但结果并没有错,即使输入的数比9大也一样。在加入的那行检验输出代码,发现a[8]为1245128,所以结果正确。记得好像越界时数字是随机产生,所以,更改了几次输出,如a[9](等于4200217),a[10](等于1)后,又发现了一个问题,即a[8],a[9],a[10]值不会改变,我是说,即使重新编译也一样,还有,我又将上面的程序代码COPY下来,然后将刚才生成的相关文件全部删除,再建了一个工作区将代码拷过去,结果仍然一样,a[8]还是1245128,a[9]是4200127,a[10]还是1。向各位大侠请教一下,对下标越界后的值到底是怎么处理的??既然是随机产生的话,为何几次编译得到的值并没有改变??
我用的是MSDEV98,对C了解还不是很多,拜托各位了
------解决方案--------------------
这里说的随机并不是指每次不一样.而是是什么值都有可能.如果越界读写可能读写到其他变量/对象的数据,还可能破坏代码.
------解决方案--------------------
越界以后可能发生的事情谁都不知道,具体牵涉到编译器如何安排还有操作系统的问题还有机器的问题,一般栈上的越界通常被用来实现所谓的“缓存区溢出攻击”,LZ可以找些资料看一下
但是永远不要相信越界操作的结果
------解决方案--------------------
越界也有一个内存地址,只是那个内存地址可能存了别的东西,不属于你.但是你非要抢来用,也是可以的.
只是..你不要抢政府的地,否则让你的机子挂掉