两道面试题所引发的C指针的思考

嵌入式电子 2023-06-23 08:55

C语言是一门使用比较广泛的高级编程语言,而指针则是C语言的精髓所在,可以说学习C语言不会灵活使用指针就谈不上精通C语言。但是由于C语言指针的灵活性导致了我们在使用过程中出现莫名其妙的各种问题,甚至是段错误。


本文将以两道典型的面试题为切入点,引发我们对于C语言指针的思考。并给予详细的解释,从原理角度来解析C指针。全文也是源码分析加结果演示的形式说明问题所在。


问题一:


以下的代码段是否正确,如果正确结果是什么?如果不正确如何改正?


  void fun(char *p)

  {

  p=(char *)malloc(100);

  }

  int main(int argc, const char *argv[])

  {

  char *str=NULL;

  fun(str);

  strcpy(str,"hello");

  printf("%s\n",str);

  return 0;

  }


如果大家不仔细看的话,一定认为是正确的,因为没有发现明显的语法错误。不错你的想法是对的,编译的时候一定可以通过,但是当你运行可执行程序的时候发现:“哎呀,段错误!”,也没错,确实也发生了段错误,也许这个段错误比较隐蔽不易发现并定位。下面我们使用gdb来定位到段错误的位置,并分析错误原因:


命令行输入:gcc -g -rdynamic test.c (test.c即是我们将源码头文件加上编写的C语言源文件),然后生成了可以以用于gdb调试且可以定位段错误的可执行程序,接下来输入gdb ./a.out 进入gdb调试模式,输入r运行程序,则立马定位到strcpy(str,"hello"); 这行程序段,于是我们回到程序中分析代码:发现是我们把一个指针常量NULL作为fun函数的参数传递给了p,造成了子函数中对一个指针常量进行赋值操作,于是就在程序运行中调用fun函数的时候造成了段错误。


以上就是这段代码的错误分析,既然我们通过gdb定位到了段错误的位置,也分析出了段错误产生的原因,那么如何修改代码才能实现相应的功能还不至于造成段错误呢?考虑到要尽量保证代码段的完整性,于是想到从传递的参数上寻突破口。既然不能传递指针常量,那么我们想到传递一个值能够装得下指针不就行了于是对代码段做如下改变(修改部分已做好了红色标记):


   void fun(char **p)

  {

  *p=(char *)malloc(100);

  }

  int main(int argc, const char *argv[])

  {

  char *str=NULL;

  fun(&str);

  strcpy(str,"hello");

  printf("%s\n",str);

  return 0;

  }


对比发现,这次我们传递了一个二级指针&str,实际上就是传递了装载指针的容器,这样以来我们就可以把在子函数中动态分配的内存空间的首地址放到了这个“容器”中了(即是str被赋值上了新分配内存的首地址)。在一次编译执行,无段错误,结果输出“hello”字符串。也就完美地解决了这道错误非常隐蔽的面试题。同样有的同学会想,把NULL掉咋样?编译运行发现还是出现段错误,还是同样的问题:指针str属于局部变量,系统会随机分配一个地址给str,同样是指针常量赋值。而当我们解决了这道题,我们能够感受到指针的灵活性和操作的隐蔽性,我们也就知道了常量是不能被赋值的(因为他被系统认为是只读),还知道了将一个二级指针作为参数传递可以保存一个地址的值,这也是编程的一个技巧。


接下来我们在看一看第二道题:


问题二:


以下代码段的执行结果?


    int main(int argc, const char *argv[])

  {

  int i,n=0;

  for(i=1;i

  {

  n=10*n+*argv-'0';

  }

  printf("%d\n",n);

  return 0;

  }

  ./a.out  12 345 678


虽然代码很简练,但是如果不细心分析还是很难把这道题答案写出来的,甚至是没有任何思路。实际上这道题考察的是大家对于指针的掌握和ascii的一些知识:大家一定要理解*argv意思,如果不注意可能会认为是取命令行参数的第二个字符串的值,其实不然,这样理解的话大家对于指向一个字符串的字符指针的的不理解,指向一个字符串的字符指针实际上是指向一个字符串首字符的地址,命令行参数输入的12  345  678看似数字,实际上是一个个字符串,*argv的意思也就是取各自字符串的首字符也就是取1、3、6,说到这里这道面试题也就引刃而解了。那么*argv-'0'是啥意思呢?很显然吗,就是将ascii表示的字符转化为对应的数字也就是数字1、3、6。到这里我们在通过推理就得到了最终的结果:136。


通过了这一番地分析是不是也挺简单的,那必须的啊,通过这道面试题我们也就知道了:指向一个字符串的指针实际上就是把字符串的首地址赋给了指针变量,还有就是一个字符减去’0’就能得到字符所对应的数字。

当然这只是两道比较易错的使用指针的面试题,很多面试题都是从大家对指针本质的认识上着手来考察大家,只要掌握指针的本质,了解常见段错误的产生的原因和处理方案,了解C语言内存的分配情况就能炼就一双”火眼金睛“,从本质上真正精通C语言。


定期以通俗易懂的方式分享嵌入式知识,关注公众号,加星标,每天进步一点点。


声明:

本号原创、转载的文章、图片等版权归原作者所有,如有侵权,请联系删除。

关注、点赞、在看、转发,支持优质内容! 

评论 (0)
  • 在六西格玛项目中,团队的选择往往决定了最终的成败。合适的团队成员不仅能推动项目顺利进行,更能确保最终成果符合预期。因此,组建六西格玛团队时,必须挑选最合适的人才,确保他们具备必要的能力和特质。团队主管的关键特质每个精益六西格玛项目都需要一位主管来带领团队。他们不仅需要具备领导力,还要能够分析数据、制定策略,并与管理层和团队成员高效沟通。团队主管的核心职责包括:领导团队行动:能够激励成员,确保团队朝着既定目标前进。数据分析能力:精通数据处理和分析,能基于数据做出决策。沟通协调:能够在管理层和团队之
    优思学院 2025-03-06 12:51 128浏览
  • 深圳触觉智能RK3506开发板现已上市,开启预售!搭载瑞芯微RK3506B/J超低功耗工业处理器(1.5GHz三核A7+M0,主频1.5GHz);支持1280×1280显示、双百兆网口、星闪无线三模,板载高达2路CAN FD与5路串口。RK3506适用场景简介工业控制‌:RK3506适用于工业控制、工业通信、人机交互等应用场景。其多核异构架构(3xCortex-A7+Cortex-M0)和外设接口丰富,支持Buildroot、Yocto系统,适合轻量级HMI应用‌。‌工业通信‌:RK3506均支
    Industio_触觉智能 2025-03-07 10:04 112浏览
  • 服务器应用环境与客户需求PCIe 5.0高速接口技术的成熟驱动着生成式AI与高效能运算等相关应用蓬勃发展。在随着企业对服务器性能的要求日益严苛,服务器更新换代的周期也持续加快。在此背景下,白牌与DIY(Do It Yourself)服务器市场迎来了新的发展契机,但同时也面临着更趋复杂的技术挑战。传统上,白牌与DIY服务器以其高度客制化与成本效益优势受到市场青睐。然而,随着PCIe 5.0等高速技术的导入,服务器系统的复杂度大幅提升,对组装技术与组件兼容性也就提出更高的要求。举个简单的例子来说,P
    百佳泰测试实验室 2025-03-06 17:00 150浏览
  • 一、系统概述MYD-LD25X搭载的Debian系统包含以太网、WIFI/BT、USB、RS485、RS232、CAN、AUDIO、HDMI显示和摄像头等功能,同时也集成了XFCE轻量化桌面、VNC远程操控、SWITCH网络交换和TSN时间敏感网络功能,为工业设备赋予“超强算力+实时响应+极简运维”的体验!类别名称描述源码TF-AArm Trusted Firmware 2.8OP-TEEOP-TEE 3.19BootloaderU-boot 2022.10KernelLinux Ke
    米尔电子嵌入式 2025-03-07 14:08 217浏览
  • 深圳触觉智能SOM3506核心板现已上市,搭载瑞芯微RK3506B/J超低功耗处理器(1.5GHz三核A7+M0),低功耗满载仅0.7W,支持40℃~85℃工作环境,即日起宽温级59元/工业级68元,特价开售!芯片介绍RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台,三核Cortex-A7+单核Cortex-M0多核异构设计,CPU频率达1.5Ghz, M0 MCU为200Mhz。RK3506适用场景简介工业控制‌:RK3506适用于工业控制、工业通信、人机
    Industio_触觉智能 2025-03-07 10:03 131浏览
  • 文/Leon编辑/cc孙聪颖2025年全国两会进行时,作为“十四五”规划收官之年,本届两会释放出坚定目标、稳中求进、以进促稳等信号。其中,企业家们的建议备受关注,关系到民营经济在2025年的走向。作为国内科技制造业的“老兵”,全国人大代表、TCL集团创始人及董事长李东生在本届两会中提出三份代表建议,包括《关于优化中国科技制造业融资环境的建议》、《关于加强AI深度伪造欺诈管理的建议》和《关于降低灵活就业人员社会保险参保门槛的建议》,表现出对科技制造、AI发展和劳动者保障方面的关注。会后,李东生接受
    华尔街科技眼 2025-03-06 19:41 120浏览
  • ASL6328芯片支持高达 6.0 Gbps 运行速率的交流和直流耦合输入T-MDS 信号,具备可编程均衡和抖动清理功能。ASL6328 是一款单端口 HDMI/DVI 电平转换 / 中继器,具有重新定时功能。它包含 TypeC双模式 DP 线缆适配器寄存器,可用于识别线缆适配器的性能。抖动清理 PLL(锁相环)能够消除输入抖动,并完全重置系统抖动容限,因此能更好地满足更高数据速率下 HDMI 抖动合规性要求。设备的运行和配置可通过引脚设置或 I2C 总线实现。自动断电和静噪功能提供了灵活的电
    QQ1540182856 2025-03-06 14:26 121浏览
  •        深夜的公园里,当路灯熄灭后,传统监控摄像头只能拍出模糊的黑白画面,仿佛老式胶片电影里的场景。而搭载为旌瑶光ISP的摄像头,却能像猫科动物一样,在几乎全黑的环境中捕捉到行人衣服的颜色、树叶的纹理,甚至快速跑动的宠物狗毛发细节。这种从“黑白默片”到“全彩4K电影”的跨越,背后是为旌瑶光ISP对传统红外补光技术的颠覆性创新。一、传统方案之困:被红外光“绑架”的夜视世界        传统安防摄像头依赖红外
    中科领创 2025-03-07 16:50 261浏览
  • 近年来,越来越多的企业在5S管理的基础上,开始追求6S、7S甚至8S管理,仿佛S越多,管理就越先进,企业就越优秀。于是,6S增加了“安全”,7S又加上了“节约”,8S甚至引入了“学习”……看似更加全面,实则很多企业只是机械地增加S,却忽略了管理的核心目标:提升效率、降低浪费、优化工作环境。优思学院认为,5S本身已经是一套成熟的精益管理工具,它的核心理念不仅简单高效,而且易于实施和推广。如果企业只是为了赶时髦,盲目增加S,而没有真正理解5S的本质,那么这些额外的“S”很可能会变成管理上的负担,而不
    优思学院 2025-03-07 12:43 160浏览
  • 随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重建的关键突破。一、3DGS技术概述与原理1、3DGS的技术概述3DGS是一种基于3D高斯分布的三维场景表示方法。通过将场景中的对象转化为多个3D高斯点,每个点包含位置、协方差矩阵和不透明度等信息,3DGS能够精确地表达复杂场景的几何形状和光照特性。与传统的神经辐射场(NeRF)方法相比,
    康谋 2025-03-06 13:17 246浏览
  • ​CS6212是一款可分别用于USB Type-C主机/显示端口源应用的带重定时的有源开关。这设备符合USB 3.2标准版本1.0和USB Type-C标准上的VESA DisplayPort Alt模式 1.0版,支持通过GPIO或12C进行灵活的模式切换。此设备支持USB 3.2第2x1代 运行速度高达10Gbps,DisplayPort 1.4运行速度高达HBR3 8.1Gbps。CS6212管脚分布及功能定义:CS6212支持重定时器训练,并支持USB 3.2标准中定义的状态状态机(RT
    QQ1540182856 2025-03-07 10:09 138浏览
  • Sub-GHz,即工作频段低于1GHz的无线通信技术,常见频段有315MHz、433MHz、868MHz与915MHz等。其可借助无线电波在自由空间传播的特性,把数据调制到射频载波上进行传输,达成物联网设备间的无线通信,是物联网设备实现高效、稳定、无缝交互的“通信基石”。典型射频信号(无线电波)收发电路简示在工业自动化、智慧城市、智慧农业与智能家居等物联网领域中,LoRa、Wi-SUN、Z-Wave、Sigfox等工业级通信协议大多运行在Sub-GHz频段。而正是通过Sub-GHz射频技术,传感
    华普微HOPERF 2025-03-07 11:39 138浏览
  • 在企业管理和职场环境中,权力是一个常被提及却又让人感到微妙的话题。有人觉得它充满吸引力,有人却对它避之不及。然而,不管你对权力的态度如何,理解它、掌握它,甚至善用它,都是职场成功的重要一环。今天,我们就来深入探讨权力的本质,特别是个人权力和社会权力的区别,以及如何在职场中逐步建立属于自己的影响力。权力的两种面貌:你掌控自己,还是掌控他人?说到权力,首先要区分它的两种类型。个人权力是你对自己生活的掌控感。比如,你能自由决定自己的职业方向,不用总是请示他人。这种权力让人感到踏实和满足,是我们在生活中
    优思学院 2025-03-07 15:56 167浏览
  • 多人同时共享相同无线网络,以下场景是否是您熟悉的日常?姐姐:「妈~我在房间在线上课,影音一直断断续续的怎么上课啊!」奶奶:「媳妇啊~我在在线追剧,影片一直卡卡的,实在让人生气!」除此之外,同时间有老公在跟客户开在线会议,还有弟弟在玩在线游戏,而妈妈自己其实也在客厅追剧,同时间加总起来,共有五个人同时使用这个网络!我们不论是在家里、咖啡厅、餐厅、商场或是公司,都会面临到周遭充斥着非常多的无线路由器(AP),若同时间每位使用者透过手机、平板或是笔电连接到相同的一个网络,可想而知网络上的壅塞及相互干扰
    百佳泰测试实验室 2025-03-06 16:50 127浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦