一个有趣的指针问题
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,该访问被禁止,程序当然会死掉。
}
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,该访问被禁止,程序当然会死掉。
}
相关文章推荐
- C语言中关于指针,二维数组等的问题,一个有趣的发现
- 关于vxworks看门狗触发函数的优先级的一个有趣问题
- 一个关于"int型二维数组"及"指针数组"作函参的地址传递和带回返回值的问题,指针的拓展练习〈二〉
- 指针引发的一个传值和传址的问题
- 共享内存内使用指针引起的一个问题。
- 一个有趣的问题:ls -l显示的内容中total究竟是什么?
- 关于||和&&的一个有趣问题
- 由一个网友的问题想到的(指针作为形参, p++ 和 p + 1的区别 )
- 一个有趣的问题——HTTP是“超文本传输协议”还是“超文本转移协议”
- 一个用指针逆置字符串问题
- 二重指针的一个问题
- 一个有趣的问题 : α_β_γ_δ_ε_ζ_η_θ_ι_κ_λ_μ_ν怎么读
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 指针的一个问题思考
- 一个关于.Net的SaveFileDialog控件(Winform)的有趣问题
- 一个将类的构造函数调用识别成函数指针的问题
- (遇到的一个问题)空指针引用, 是可以改变这个指针所指内容的。
- 一个有趣的问题——MySQL中varchar的最大长度
- 关于asp.net 1.0升级到asp.net 2.0时发现的一个有趣的问题
- 一个有趣的SQL问题。