C/C++知识点之大神是如何玩C语言的!
小标 2018-11-01 来源 : 阅读 907 评论 0

摘要:本文主要向大家介绍了C/C++知识点之大神是如何玩C语言的!通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之大神是如何玩C语言的!通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

我在酷壳上看到一篇文章,C语言结构体里的成员数组和指针,看得感觉让我真是佩服地五体投地啊。皓哥虽说谦称自己不是高手啥的,但是写出这样的文章来,真是让我感觉自己的水平真是渣渣!我看完了感觉有点小激动,也想自己讲讲,试试,看看能不能讲清楚那个微博中所叙述的的问题,绝对没有抄袭的意思。由于我的水平实在有限,写的可能很糟糕,还请各位见谅!

   
  OK,废话少说,先来说说一下问题,有这么一段代码,

 1 #include<stdio.h>
 2 struct str{
 3     int len;
 4     char s[0];
 5 };
 6 
 7 struct foo {
 8     struct str *a;
 9 };
10 
11 int main(int argc, char** argv) {
12     struct foo f={0};
13     if (f.a->s) {
14         printf( f.a->s);
15     }
16     return 0;
17 }

  这个程序会在哪一行挂掉呢?我用的是gcc,我这里是在第14行挂掉的。为什么呢?为什么那个if语句那里不挂掉,而是在printf语句这里挂掉呢?
  这个我们首先得分析变量是啥?变量是啥,其实就是内存区域的别名!而结构体类型的变量,其实就是一大块内存区,然后结构体变量名指向的是这块内存区的起始地址,然后根据变量的类型来不断向后推出其他变量。比如上面那个str结构体。其实就是一块4字节内存用来存放int变量len,然后后面的字节用来存放字符数组s。我们可以通过gdb打印出他们的地址,如下图所示:
  
  这里结构体变量t和它的第一个成员len的地址都是0xbffff184,而它的s成员的地址就是t的地址+4也就是0xbffff188。OK,通过这样的叙述不知道大家能不能理解,其实结构体中每个成员的变量的地址其实就是结构体变量的地址加上相对偏移。比如上面例子中s的地址就是t的地址加上4个字节(代表int变量)。
  知道了这个概念,我们来分析一下这段程序。
  
  首先从主函数开始,建立了一个f变量,里面有一个成员是指针a,然后指针a里面存放的地址被初始化为0。然后在if语句中使用的是f.a->s,它就是找到一个地址,就是s变量的地址,寻找的方式就是先找到结构体变量指针a中存放的地址,然后再对这个地址+4,然后找到这个地址之后并没有去访问这个地址所代表的内存空间,所以程序没有报错。而在print语句中呢,也是先找到这个地址,然后去访问这个地址所代表的内存空间,试图在这个空间中寻找一串字符串并输出出来。由于a中我们已经初始化为0,所以访问的内存空间就是0x4的空间,所以程序就会挂掉了!^ o ^

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程