盘点一些在C语言中比较容易犯的错误

本题中的#运算符可以利用宏参数创建字符串。##运算符和#运算符一样也可以用于类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分,这个运算符可以把两个语言符号组合成单个语言符号,所以该运算符也被成为“预处理粘合剂”。类参数宏展开遵循一定的顺序,先从外层开始探寻如果遇到#即刻结束探寻,从遇到#处开始一步一步向外层展开,如果没有遇到#探寻到最里层结束探寻,然后一步一步向外层展开。
所以printf(%s\n,h(f(1,2)));这条语句的展开顺序为:h(f(1,2))(没有#) --->> f(1,2)(到达最里层依然没有#) ---->> h(12) ---->> 12。
然而printf(%s\n,g(f(1,2)));这条语句的展开顺序是:g(f(1,2))(碰到#即刻结束探寻,开始展开) ----->>f(1,2)。
二、类型转换
浅析:第一眼看到这道题心里想到这不明摆着 -10 + 1 0。
三、溢出问题
程序一:unsignedi; for(i=110;i>=0;i--) printf(%u\n,i);
运行结果:
死循环
浅析:该题的坑就在于没有注意到unsigned int 的存储范围,当小于零溢出时又会从unsigned int 的最大值开始递减,这就仿佛进入了一个圆环,永远都没有办法找到跳出圆环形跑道的缺口。
程序二:#include #include intmain(void) { chara[1000]; inti; for(i=0;i<1000;i++) a[i]=-1-i; printf(%d\n,strlen(a)); return0; }
运行结果: 255
浅析:这道题看上去很简单但是却暗藏杀机,很少有人能够答对,当i从0开始自增,自增到127时-1 - 127 = -128,而这个数正好是char型变量所能表示的最小数字,i再自增一次就会溢出,变成char所能表示的最大数字,这样又进入了上一题的那个“环”,当i增加到255时-1 - i = 0,此时第一次出现了0,而strlen函数碰到'\0'就结束(不包括),因此输出结果为255。
四、strcpy函数
voidtest() { charstr[10],str1[10]; inti; for(i=0;i<10;i++) { str1[i]='a'+i; } strcpy(str,str1); }
浅析: 这段代码第一眼看过去是没问题的,但是再看一眼就能够很轻松找到错误了,strcpy函数是拷贝字符串的函数,它是以'\0'为结尾的,因此当程序运行strcpy这一行时会发生内存非法访问导致程序崩溃。
fqj

如何实现低功耗、高能效的视频综合集控系统的设计
重庆移动5G试验网,已在两江新区正式开通,后续将逐步扩大覆盖范围
荣耀10青春版铃兰白高清图赏
电机控制器核心零件散热,选择哪种导热界面材料?
清洁不费力,蒸汽拖把什么牌子好
盘点一些在C语言中比较容易犯的错误
东风岚图汽车与华为正式签署战略合作协议
电瓶修复——细说电池之“胶体”2-1
等离子清洗机的工作原理是怎样的
这4种CPU错误该如何找到,没找到会有什么后果
浅析彩电行业发展的三大趋势
IGBT驱动优化的底层逻辑是什么
如何利用机器学习破解验证码的源代码教程
笔记本电脑的电源适配器可以通用吗?
高效率升压转换剥夺并口-High-Efficiency St
剖析高性能MCU重塑行业的5大特性
OPPO终于要自研芯片吗?
一款人见人爱的chatGPT类浏览器插件
可燃气体传感器报警器:检测天然气泄漏并发出警报
常用的尺寸测量仪器之内径测量仪,它的原理分析