您的位置:首页 > 其它

一个有趣的指针问题

2009-08-20 20:56 225 查看
是从网上看到的一个例子:
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;

}

问程序会在哪一行死掉~



解答:程序运行到最后一行就会报出异常,死掉.

具体解答为:

首先需要说明的是结构体S,语句struct S s;系统会给s分配连续的两个word的空间.

void main()

{

struct S s;

int * p = &s.i;

p[0] = 4; //s.i = 4;s的第一个word的空间被写为4.

p[1] = 3; //p[1]指向的是s.i紧接的一个word空间,即s.p的指针空间,p[1] = 3;此处已经将指针s.p指向了内存0x000003处,这里是系统的保护内存,不允许访问。如果接着写s.p[0] = xxxx,程序也会死掉。

s.p = p; //此时s.p指向了p,是正常的,s的第二个word空间为p所指向的地址,即s.i的地址。

s.p[1] = 1; //修改了s的第二个word的值,即修改了指针s.p所指向的地址,使其指向了内存的0x00000001

s.p[0] = 2; //此处,是要访问系统内存0x00000001,该访问被禁止,程序当然会死掉。

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: