指针应用小结(一)

来源:互联网 发布:殷承宗 知乎 编辑:程序博客网 时间:2024/06/15 12:21

指针是C/C++中最灵活的变量,可随意指向任何内存地址,稍有不慎,就会造成程序崩溃,且很难找出原因。

下面这道题,程序crash,一开始没找到原因,经过gdb调试之后,找到根本原因。

struct sInt{  int i;  int *p;};//在64位环境下,sizeof(sInt) = 8; 其中 i占4个字节,p占8个字节,为了保证字节对齐,编译器对i之后地址补齐(加上int padding,占4个字节),共16字节//8字节对齐是为了提高CPU对数据的读取效率int test_sInt(){  sInt s;  int *p=&s.i;  p[0]=0;  p[1]=1;  p[2]=2;  p[3]=3;  s.p=p;   //s.p指向s.i的地址  s.p[0]=0;//对s.i赋值  s.p[1]=1;//对padding赋值  s.p[2]=2; //对s.p赋值,s.p指针将“飞走”,指向一个非法地址  s.p[3]=3;//对一个非法地址赋值,Segmentation fault  return 0;} //下面对程序做了下扩展测试,如果i,p为2个局部变量,程序一样crash。int test_int(){  int i;  int *p;  i = 0;  p = &i;  p[0]=0;  p[1]=1;  p[2]=2;//i,p不属于结构体,不用8字节对齐,所以在p[1]赋值时,指针p就"飞走了",p[2]为非法内存,Segmentation fault  p[3]=3;  return 0;} //如果结构体中成员变量为char,程序不一定会crash。//这是因为char *p 占8个字节,p[8]赋值改变1个字节的内容,指针“飞”的很近,可能在合法范围内,所以不一定会crash;//     而int *p也占8个字节,p[2]赋值将会改变4个字节的内容,指针“飞”跑了,逃出合法范围,必将crash.struct sChar{  char i;  char *p;};int test_sChar(){  sChar s;  char *p=&s.i;  for(int i = 0; i<16; i++)  {    p[i] = 'a';   }  s.p=p;  for(int i = 0; i<16; i++)  {    s.p[i] = 'a'; //i>8时,随机Segmentation fault  }   return 0;} int main(){  test_sInt();  test_int();   test_sChar();  return 1;}


 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 好省输入订单编号查不到订单怎么办 快递没有当面验收后发现损坏怎么办 支付宝电脑付款风控异常怎么办 京东买东西地址填错了怎么办 商场卖的衣服跟官网差价大怎么办 网购的衣服有好几个破洞怎么办 出租发票有牌号是假的怎么办 支付宝里的多收多保被降级了怎么办 超市购物卡余额与实际不符怎么办 发广告的公众号无法取消关注怎么办 扣扣需要手机验证码登录怎么办 驾校报了联系不了教练了怎么办 手机号被别人注册了百度网盘怎么办 注册公司云证书申请成功后怎么办 淘宝购物卖家迟迟不发货怎么办 淘宝直播顾客加购物车不下单怎么办 东方航空联程机票航班延误怎么办 别别人伸请更换手机绑定qq怎么办 绑定手机号的扣扣忘记密码怎么办 微信公众号个人主体变更公司怎么办 微信号注册成订阅号了怎么办 微信开通了企鹅影院会员怎么办 注销公众号对公账号填写错误怎么办 国外邮的东西在北京扣了手续怎么办 微信购物商城买的东西不发货怎么办 魅族手机电话图标没有了怎么办 新商盟网页新商盟网页打不开怎么办 京东商城购物车装满了怎么办 商家想入住美团没有营业执照怎么办 旅行团定好的人数临时加人该怎么办 淘宝上发货后12天未收到款怎么办 京东购买的东西烂了怎么办 苹果4s手机激活密码忘了怎么办 小米4c返回键失灵了怎么办 小米4c下面三个键失灵怎么办 谷歌浏览器打不开指定的网址怎么办 电脑上我的电脑图标没了怎么办 手机上的短信图标没了怎么办 qq密保手机被别人换了怎么办 苹果六手机很卡网络不给力怎么办 堡垒之夜卡在载入界面怎么办