一道考指针的笔试题
去一家公司笔试时遇到这么一道笔试题,和同学讨论后还是有点不太懂所以发贴问一下。题目:
以下这段代码运行是在什么时候死掉
typedef struct{
int i;
int *p;
}S;
int main( )
{
int *p;
p[0] = 4;
p[1] = 3;
S s;
p = &s.i;
p[1] = 2;
p[0] = 1;
return 0;
}
我和同学讨论后的结果是
在vc2005和DEV-cpp下,整段代码都能通过编译,但运行时在
p[0] = 4; 这一句出现了问题。因为在运行下面这一段代码时就死掉了
typedef struct{
int i;
int *p;
}S;
int main( )
{
int *p;
p[0] = 4;
return 1;
}
但让人觉的奇怪的是
在TC3.0下,运行以下这一段代码却能正确输出结果!
typedef struct{
int i;
int *p;
}S;
int main( )
{
int *p;
p[0] = 4;
p[1] = 3;
printf( "p[1]=%d, p[0]=%d ", p[1], p[0] );
return 1;
}
有哪位高手能解释一下为什么会这样子吗?
[解决办法]
编译器不一样是有区别的,TC30也许能自动地给指针所指向的地址分配内存吧。
[解决办法]
int *p;
p[0] = 4;
p[1] = 3;
p 是未初始化的指针,
它的值是未知的,
那么 p[0] p[1] 操作的是什么地址也是未知的。
只要这个 p[0] p[1] 不是访问受保护的内存地址,
那么 赋值 过程就可以安然无恙。
也就是说,
这个没有发生错误,
是看 运气,如果访问了非法内存,那就over ...
[解决办法]
int *p;并未申请内存空间,当前p也并未进行初始化,c++标准并不保证对其进行初始化,因此其值可能会指向内存中的任何地方。很多编译器会在标准的基础上做很多额外的工作,但它们到底会怎么做或做了什么就只有它们的设计人员知道了
[解决办法]
的确是应该看运气了,如果p乱指一气,指到了保护内存,那么对它进行p[0],p[1]的赋值就立即down
[解决办法]
最好是用new或者malloc申请空间
用delete或者free释放空间
上面申请释放关键词要对应,养成好习惯,呵呵
[解决办法]
受保护的内存应该是操作系统使用的内存,如果你的程序修改了这样的内存,当然会引起系统的死掉
[解决办法]
正确输出应该是编译器优化的结果,你看看反汇编代码吧