读书人

一段看不懂的程序。解决方案

发布时间: 2013-04-07 12:50:11 作者: rapoo

一段看不懂的程序。
struct S
{
Int i;
int * p;
};


Void main()
{
S s;
int * p=&s.i;
p[0]=4;
p[1]=3;
s.p=p;
s.p[1]=1;
s.p[0]=2;
}
代码是用pad手打的。可能对齐不是很好看。
我就是想请问这里面的每一句的意义。真的看不懂。还有就是这个代码会在哪崩溃,求详细分析。



}
[解决办法]


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


void main()
{
S s;//定义S结构的一个对象
int * p=&s.i;//这里是把s中i的地址给指针p
p[0]=4;//这里给指针所指向的地址赋值,也就是给i赋值
p[1]=3; //这个结果是未定义的,给一段莫名的空间赋值,这里可能出错
s.p = p;//这里把s中的p指向上面p指针的地址,这里也就是i的地址
s.p[1]=1; //这个结果是未定义的,给一段莫名的空间赋值,这里可能出错
s.p[0]=2;//改变i的值
}

[解决办法]
说一下我的理解。。

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

void main()
{
S s;
int * p=&s.i;
p[0]=4;//s.i = 4
p[1]=3;//s.p = 0x3
s.p=p;//s.p = &s.i
s.p[1]=1;//s.p = 0x1
s.p[0]=2;//将地址0x1赋值为2,这里会崩溃
}

[解决办法]

S s; //创建一个结构体对象
int * p=&s.i;//定义一个指针p,指向s成员中i的地址
p[0]=4;//相当于s.i = 4;
p[1]=3;//相当于s.p = 0x00000003
s.p=p;//此时s.p指向i的地址
s.p[1]=1;//相当于s.p = 0x00000001;
s.p[0]=2;//对0x00000001内存进行写操作出错

[解决办法]
struct S
{
Int i;
int * p;
};


Void main()
{
S s;
int * p=&s.i;
p[0]=4;
p[1]=3;//虽然赋了一个未做声明的地址0x00000003,但没进行访问,不报错
s.p=p;
s.p[1]=1;
s.p[0]=2;//出错,访问了一个未做声明的地址0x00000001
}
对于一个未做声明的地址直接进行访问,就会报错

读书人网 >C语言

热点推荐