是从网上看到的一个例子:
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,该访问被禁止,程序当然会死掉。
}