C++中指针与内存问题

weiwei_baby 2018-03-08 05:57:59
在面试宝典上看到这么一题:
下列程序会在哪一行崩溃?
struct S {
int i;
int * p;
};
main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;
s.p=p;
s.p[1]=1;
s.p[0]=2;
}
这里答案是s.p[0]=2;行程序会崩溃。
我想问的是在int * p=&s.i;这行中,i之前并没有被赋值,这样做会不会使p成为一个
野指针?不会的话是为什么?
另外,C++中声明一个变量但未定义此变量时到底会不会给这个变量分配内存?
...全文
484 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-09
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
mstlq 2018-03-08
  • 打赏
  • 举报
回复
楼主前面的问题,版主已经在1楼说清楚了 至于后一个问题,声明(非定义)的情况下不会分配内存,可以参考 http://zh.cppreference.com/w/cpp/language/definition
真相重于对错 2018-03-08
  • 打赏
  • 举报
回复
struct S { int i; int * p; }; main() { S s;//这里定义一个值类型的S,s.i ,s.p 都已经有了分配了内存。只不过没有赋值。 int *p=&s.i; //这里声明了一个整形指针变量,它指向的地址是s.i; p[0]=4;//所以这里可以赋值,也就是说 ,s.i被赋值为4 p[1]=3;//这个语句有问题,因为p[i]指向了s.i的下一个地址,默认情况下是 s.p; s.p=p; 这个s.p指向了 s.i 的地址; s.p[1]=1;//同上上一步s.p[1] 其实就是s.p 这里就是把s.p 这个指针修改为1. s.p[0]=2;//对1这个地址写入值,必然崩溃。 }
paschen 2018-03-08
  • 打赏
  • 举报
回复
s.i没赋值和p没什么关系,你这句只是让p指向s.i这个变量,p自然也不会是野指针,赋值后它指向了s.i,这个内存是有效的,只不过是它指向的内存中的值没有初始而已

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧