短短几行代码,欢迎大家进来叙旧聊天拿分!

yiruirui0507 2010-09-07 11:58:19
struct S{
int i;
int *p;
};

void main(){
S s;
int *p=&s.i;
p[0]=3;
p[1]=3;
s.p=p;
// s.p[1]=(int)&p;
s.p[1]=1;
s.p[0]=2;
}

编译没出错,运行出错。题目有点诡异,大家给分析分析。先谢谢!看看哪里出了漏洞?
...全文
550 63 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
yashuwa0622 2010-09-08
  • 打赏
  • 举报
回复
void main()
{
S s;
int *p=&s.i;
p[0]=3; //s.i=3;
p[1]=3; //此句被下面的一句屏蔽掉了,无用
s.p=p; //s.p=&s;
// s.p[1]=(int)&p;
s.p[1]=1; //s.p=1;
s.p[0]=2; // 此句相当于 *(int*)(1)=2,肯定是有问题的
}
kouji1990 2010-09-08
  • 打赏
  • 举报
回复
我也想知道为什么
上善若水邻 2010-09-08
  • 打赏
  • 举报
回复
昨天夜里没认真研究,所以错了现在再看我们发现问题出在p[1] = 0;这里

#include<iostream>
#include<string>
using namespace std;
struct S{
int i;
int *p;
};
int main(){
S s;
int *p = &s.i;
p[0] = 3;
p[1] = 0;//这时p[1]的地址是:00000000

cout<<"p的地址:"<<&p[0]<<"\t s.i的地址:"<<&s.i<<endl;
cout<<"p[1]的地址:"<<p[1]<<"\t s.i的地址:"<<&s.p<<endl;

cout<<"p[0]的值:"<<p[0]<<"\t s.i的值:"<<s.i<<endl;
cout<<"p[1]的值:"<<p[1]<<"\t s.p的值:"<<s.p<<"\t s.p的地址:"<<&s.p<<endl;
s.p = p;//这里的s.p保存的是p的地址,s.p本身的地址没变
cout<<"s.p的值:"<<s.p<<"\t s.p的地址:"<<&s.p<<endl;
s.p[0] = 1;
cout<<"s.p[0]的值:"<<s.p[0]<<"\t s.p[0]的地址:"<<&s.p[0]<<endl;
cout<<"s.p[1]的值:"<<s.p[1]<<"\t s.p[1]的地址:"<<&s.p[1]<<endl;
s.p[1] = 0;//问题出在这里了这时s.p[1]的地址改变为了00000004,而s.p的保存的值为0000000
cout<<"s.p[1]的地址:"<<&s.p[1]<<"\t s.p的值为:"<<s.p<<endl;
//cout<<"s.p[1]的值:"<<s.p[1]<<endl;如果加上这句就出错,因为s.p[1]的地址被改变为了00000004
//我们可能觉得s.p[1]指向的应该是s.p值,其实不是因为s.p的值没有改变
return 0;
}

到现在我还没有理解s.p[1]到底指向的是谁???
NoneSec 2010-09-08
  • 打赏
  • 举报
回复
额,看来我这功力太浅了,得继续学习啊……
dingshaofengbinbin 2010-09-08
  • 打赏
  • 举报
回复
嗯,不错!!!顶一下!!!
欣客 2010-09-08
  • 打赏
  • 举报
回复

#include "stdafx.h"

struct S{
int i;
int *p;
};

void main(){
S s;
int *p=&s.i;
p[0]=3;
p[1]=3;
s.p=p;
// s.p[1]=(int)&p;
// s.p[1]=1;
s.p[0]=2;
s.p[1]=1;
s.p[0] = 3;
}
这样就明白了, 因为s.p[1] = 1.把s.p 的地址改变了,s.p[0] = 2,是在s.p的地址上写,c++是不允许在没有分配空间的地址上读写的。所以报错。
你可以继续修改s.p[0]的值,你会发现这时候是写入不了的。
昵称很不好取 2010-09-08
  • 打赏
  • 举报
回复
好像程序员面试宝典上有这道题
weili_1 2010-09-08
  • 打赏
  • 举报
回复
......这么几句话,看着都要崩溃
yiruirui0507 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]
s.p[1]=1;//你这里将s.p里面的地址改为1
s.p[0]=2;//然后对地址为1的内存进行写,这肯定是不允许的。
[/Quote]

那交换一下为什么就不出错了呢?
yiruirui0507 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wizardoz 的回复:]
C/C++ code

struct S{
int i;
int *p;
};

void main(){
S s;
int *p=&s.i;
p[0]=3;
p[1]=3;
s.p=p;
// s.p[1]=(int)&p;
s.p[1]=1; // <== 这里还不越界吗?
s.p[0]=2;
}
[/Quote]

没越界的。
pengzhixi 2010-09-08
  • 打赏
  • 举报
回复
s.p[1]=1;//你这里将s.p里面的地址改为1
s.p[0]=2;//然后对地址为1的内存进行写,这肯定是不允许的。
WizardOz 2010-09-08
  • 打赏
  • 举报
回复

struct S{
int i;
int *p;
};

void main(){
S s;
int *p=&s.i;
p[0]=3;
p[1]=3;
s.p=p;
// s.p[1]=(int)&p;
s.p[1]=1; // <== 这里还不越界吗?
s.p[0]=2;
}

yiruirui0507 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ww884203 的回复:]
p[1]应该是s.p,也就是一个指针,你把指针赋了一个数字值,所以不对
[/Quote]

编译没错,运行出错,你的分析不对啊,再考虑考虑吧!
八哥 2010-09-08
  • 打赏
  • 举报
回复
struct S{
int i;
int *p;
};

void main(){
S s;
int *p=&s.i;
p[0]=3; //s.i=3
p[1]=3; //s.p=3 3不是一个有效地址,,导至s.p[1]出错
s.p=p;
// s.p[1]=(int)&p;
s.p[1]=1;
s.p[0]=2;
}
ww884203 2010-09-08
  • 打赏
  • 举报
回复
p[1]应该是s.p,也就是一个指针,你把指针赋了一个数字值,所以不对
yiruirui0507 2010-09-08
  • 打赏
  • 举报
回复
去掉s.p[1]=1; 改成
// s.p[1]=(int)p;就行啊


另外 s.p[1]=1;
s.p[0]=2;
交换一下就不会错

问题很诡异,自己跟踪了半天最后还是失踪了。
canshui 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 zecard_fu 的回复:]
引用 31 楼 canshui 的回复:

在上面的代码里面,最主要的是s.p的地址变成了1,这时候对s.p进行任何操作都是越界的
这里什么意思,s.p[1]=1,s.p的地址不是1啊,你这里说的不对吧?

楼主,这里确实改成1了

s.p 的地址没变! s.p 的值变了! s.p本身是个指针! s.p[1]也是*(s.p+1) s.p[0]也是*(s.p) 这里s.p是1 也就是 ……
[/Quote]

醍醐灌顶,受教了!……
yiruirui0507 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 zecard_fu 的回复:]
引用 43 楼 yiruirui0507 的回复:

引用 42 楼 hawk198 的回复:
引用 40 楼 yiruirui0507 的回复:
难道因为0x1是系统的内存地址,我们无权修改吗?还是什么??

0x1是head代码,不属于我等能使用的


请问何为head代码,能给点资料或者解释吗?

看 赵烔 内核完全剖析! 第6章 引导启动程序!
[/Quote]

3ks!
macrojj 2010-09-08
  • 打赏
  • 举报
回复
s.p指向了自己。

然后 s.p不指向自己了。 指向个别的地方。
然后 尝试写。
大奶兔白糖 2010-09-08
  • 打赏
  • 举报
回复
struct S{
int i;
int *p;
};

void main(){
S s;
int *p=&s.i;
p[0]=3;
p[1]=3;
s.p=p;-->此时s.p指向了s.i的地址
// s.p[1]=(int)&p;
s.p[1]=1; -->导致s.p所指向的地址变为了0x00000001
s.p[0]=2;-->对地址0x00000001地址进行写操作,挂了……
}
加载更多回复(43)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧