返回信息流struct S
{
int i;
int * p;
};
void main()
{
struct S s;
int * p = &s.i;
p[0] = 4;
p[1] = 3;
s.p = p;
s.p[1] = 1;
s.p[0] = 2;
}
这是一条镜像帖。来源:北邮人论坛 / soft-design / #20396同步于 2007/8/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
这个程序哪里错了?
staywithyou
2007/8/14镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
s.p = p这一步有问题,把s.p指向p的指向,而p是指向s的起始地址的,那么s.p[1]其实存的就是s.p的起始地址,把它赋个1,再对这个不能操作的地址1赋值2,就会报错了
感觉这道题错误不止一点两点。
首先把一个指向单个int形变量的指针当成有2个int的数组来用就不对。
就算当p[1]指的是S.p,随便给指针赋整数值也不对吧。
main函数int不int是规范的问题。
这个程序太诡异了。我不信真的会有人会这样做。
传说windows"甚至能够允许一个指针到处乱指,甚至指向根本没有东西的内存空间,而且这种程序还能执行"
是不是因为出题人是微软的?
int * p = &s.i;
p[0] = 4;
p[1] = 3; // 根据C++的数据储存特点(结构型的) 这儿是不行的
s.p = p;
s.p[1] = 1;
s.p[0] = 2; //这儿也是不行的
如果从实际内存结构来看。。。
也不是说不能赋值。。。
虽说C/C++是强类型。。。但也不代表就不能混用。。。
从汇编后的结果来看。。。管你是int还是pint。。。都是一个DWORD值而已。。。(当int取32位时)
这样p[1]就是s.p也没啥不可以。。。
缓冲区溢出不就是这么干的么。。。
只能说是逻辑错误。。。从语法上来说。。。还真可以。。。你可以Debug逐步试试。。。-ω-
如图
【 在 wks 的大作中提到: 】
: 感觉这道题错误不止一点两点。
: 首先把一个指向单个int形变量的指针当成有2个int的数组来用就不对。
: 就算当p[1]指的是S.p,随便给指针赋整数值也不对吧。
: ...................