电子发烧友网 > 今日头条 > 正文

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

2020年06月24日 16:45 次阅读

本题中的#运算符可以利用宏参数创建字符串。##运算符和#运算符一样也可以用于类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分,这个运算符可以把两个语言符号组合成单个语言符号,所以该运算符也被成为“预处理粘合剂”。类参数宏展开遵循一定的顺序,先从外层开始探寻如果遇到#即刻结束探寻,从遇到#处开始一步一步向外层展开,如果没有遇到#探寻到最里层结束探寻,然后一步一步向外层展开。

所以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么,如此easy的题目还要算吗?当程序运行出结果时顿时傻眼了,仔细看了看数据类型发现问题出在了类型的转换上。众所周知,在不同类型的数据进行运算时如果不进行特别的转换那么在数据运算时会先将表示范围较小的数据自动转换成表示范围更广的数,再参与运算,所以本题中会先将int型的a转换成unsigned int型,通过补码运算得知该值为:4294967286,该值加上1会肯定会远大于0,因此输出的是a+b>0。

三、溢出问题

程序一:unsigned i; for (i = 110; i >= 0; i--)   printf("%u\n",i);

运行结果:

死循环

浅析:该题的坑就在于没有注意到unsigned int 的存储范围,当小于零溢出时又会从unsigned int 的最大值开始递减,这就仿佛进入了一个圆环,永远都没有办法找到跳出圆环形跑道的缺口

程序二:#include  #include  int main(void) {   char a[1000];   int i;   for(i = 0; i < 1000; i++)     a[i] = -1 -  i;   printf("%d\n",strlen(a));   return 0; }

运行结果: 255

浅析:这道题看上去很简单但是却暗藏杀机,很少有人能够答对,当i从0开始自增,自增到127时-1 - 127 = -128,而这个数正好是char型变量所能表示的最小数字,i再自增一次就会溢出,变成char所能表示的最大数字,这样又进入了上一题的那个“环”,当i增加到255时-1 - i = 0,此时第一次出现了0,而strlen函数碰到'\0'就结束(不包括),因此输出结果为255。

四、strcpy函数

void test() { char str[10],str1[10]; int i; for(i = 0; i < 10; i++)   {     str1[i] = 'a' + i;   } strcpy(str,str1); }

浅析: 这段代码第一眼看过去是没问题的,但是再看一眼就能够很轻松找到错误了,strcpy函数是拷贝字符串的函数,它是以'\0'为结尾的,因此当程序运行strcpy这一行时会发生内存非法访问导致程序崩溃。

fqj

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

嵌入式C语言进阶课程

实际工程经验为蓝本,结合C语言中易错和长期被误解的知识点进行深度讲解。
发烧友学院发表于 2018-12-14 00:00 5263次阅读
嵌入式C语言进阶课程

在C语言中,全局变量滥用的后果是什么

01 啥是全局变量 说起全局变量,就不得不提到全局变量,局部变量,静态全局变量,静态局部变量,这些都....
发表于 2020-06-24 17:14 0次阅读
在C语言中,全局变量滥用的后果是什么

c语言入门:c语言的具体结构

变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前....
发表于 2020-06-23 15:38 112次阅读
c语言入门:c语言的具体结构

为什么要将C语言作为入门语言?

编程是向计算机发出指令以执行特定任务或执行指令的行为,目前专业行业和学术界使用数百种编程语言。一个人....
发表于 2020-06-23 15:13 40次阅读
为什么要将C语言作为入门语言?

大学生如何学习FPGA初学者怎么学FPGA

无论是从自身的发展,还是从FPGA所拥有的巨大市场来讲,学习FPGA都是一个不错的选择,对大家来说FPGA技术...
发表于 2020-06-23 15:12 84次阅读
大学生如何学习FPGA初学者怎么学FPGA

算法:计算Fibonacci number的六个...

算法:计算Fibonacci number的六个方法
发表于 2020-06-22 17:27 124次阅读
算法:计算Fibonacci number的六个...

编译器优化对函数的影响

编译器如gcc,可以指定不同的优化参数,在某些条件下,有些函数可能会被优化掉。
发表于 2020-06-22 14:58 173次阅读
编译器优化对函数的影响

C语言算法分析:求最长的递增数列

求最长的递增数列(Longest Increasing sequence, LIS)是一个比较常见的....
发表于 2020-06-22 14:57 83次阅读
C语言算法分析:求最长的递增数列

ARM架构:函数调用参数超过四个的传递方法

众所周知,ARM架构下,函数参数是通过 r0~r4寄存器传递的;但是如果参数超过四个,就要借助于栈了....
发表于 2020-06-22 14:36 982次阅读
ARM架构:函数调用参数超过四个的传递方法

虚拟机:编译器对C函数的名字修饰

虚拟机:编译器对C函数的名字修饰
发表于 2020-06-22 11:44 157次阅读
虚拟机:编译器对C函数的名字修饰

详解C语言二分查找算法细节

我相信对很多读者朋友来说,编写二分查找的算法代码属于玄学编程,虽然看起来很简单,就是会出错,要么会漏....
发表于 2020-06-22 09:05 115次阅读
详解C语言二分查找算法细节

C语言:LeetCode 153寻找旋转排序数组...

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
发表于 2020-06-22 08:59 74次阅读
C语言:LeetCode 153寻找旋转排序数组...

查找山脉数组最大值的三个方法

何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:
发表于 2020-06-22 08:51 85次阅读
查找山脉数组最大值的三个方法

C语言: Leetcode 33搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
发表于 2020-06-22 08:51 75次阅读
C语言: Leetcode 33搜索旋转排序数组

C语言:leetcode 35搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会....
发表于 2020-06-22 08:40 58次阅读
C语言:leetcode 35搜索插入位置

添加了InitAdc函数脱机在Flash运行就有问题是为什么?

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File /...
发表于 2020-06-19 14:07 133次阅读
添加了InitAdc函数脱机在Flash运行就有问题是为什么?

报告IQtoF链接不成功怎么办

undefined first referenced symbol in file --------- ---------------- _IQtoF F:\SVN_Work\branches\C...
发表于 2020-06-19 11:11 32次阅读
报告IQtoF链接不成功怎么办

2.4g检测函数对发射程序有什么影响

u8 NRF24L01_Check(void) { u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; u8 i; SPI1_SetSpeed(S...
发表于 2020-06-18 23:20 16次阅读
2.4g检测函数对发射程序有什么影响

探讨单片机C语言编程理论知识

编程思路和算法决定一个程序的优劣,是单片机编程的大问题,只有在实际动手编写的时候才会有深切的感悟。一....
发表于 2020-06-18 16:06 205次阅读
探讨单片机C语言编程理论知识

单片机C语言编程:.H文件与.C文件的关系

经过查找资料得知,.H文件就是头文件,估计就是Head的意思吧,这是规范程序结构化设计的需要,既可以....
发表于 2020-06-18 15:18 182次阅读
单片机C语言编程:.H文件与.C文件的关系

什么原因使外部中断服务函数进不去呢?

#include "stm32f10x.h" void gpio_init()//PA0为外部中断触发脚,PA2控制led {   GPIO_Ini...
发表于 2020-06-18 05:55 24次阅读
什么原因使外部中断服务函数进不去呢?

关于用系统时钟延时的问题如何解决

             1.请问systick库函数的定义在哪啊,有人说是在misc中定义的,...
发表于 2020-06-18 04:35 20次阅读
关于用系统时钟延时的问题如何解决

请问delay_xms()延时,会不会引起任务调度?

delay_xms()延时,不会引起任务调度的意思应该是:这个函数不会主动引起任务调度,但是在延时时间里,也是会有SYST...
发表于 2020-06-17 04:36 17次阅读
请问delay_xms()延时,会不会引起任务调度?

FREERTOS 高优先级任务不能调度低优先级任务照常运行怎么办

建立四个任务,两个优先级级相同的任务,两个比此优先级高的任务,开始任务调度后,高优先级任务无法运行,在每个任务...
发表于 2020-06-17 02:36 19次阅读
FREERTOS 高优先级任务不能调度低优先级任务照常运行怎么办

FreeRTOS 9.0 vTaskDelayUntil( )函数源码问题如何解决

如图在绝对延时函数vTaskDelayUntil( )中 1165行,当变量xConstTickCount没有溢出且任务唤醒时间变量xTimeT...
发表于 2020-06-16 04:35 30次阅读
FreeRTOS 9.0 vTaskDelayUntil( )函数源码问题如何解决

FreeRTOS创建开始任务,启动调度后无法进入开始任务函数怎么回事

源码如下:麻烦各位大神帮忙看下是什么原因导致,谢谢。 #include "led.h" #include "delay.h" #include "sys.h" ...
发表于 2020-06-16 04:35 22次阅读
FreeRTOS创建开始任务,启动调度后无法进入开始任务函数怎么回事

一个低功耗应用的案例分析

其实,HAL_ADC_DeInit(&hadc)的功能只是将ADC模块本身及相关寄存器恢复成复位初状....
发表于 2020-06-15 09:27 358次阅读
一个低功耗应用的案例分析

FIR滤波器的第二种设计方法——频率取样法

通过前面学习窗函数法,我们知道,窗函数法得到的h(n)是对理想滤波器的hd(n)进行截断得到的,所以....
发表于 2020-06-13 15:11 303次阅读
FIR滤波器的第二种设计方法——频率取样法

制作一条KUKA-C4机器人的提示框!

用函数 Set_KrlDlg( ) 可生成一则对话信息。 这意味着,该信息提示被传递到信息缓存器中....
发表于 2020-06-12 14:33 176次阅读
制作一条KUKA-C4机器人的提示框!

KUKA控制力的函数ACTIVATE_FORCE...

GLOBALDEF SGM_MOVE_TO_FORCE (FORCE :IN, MovementTy....
发表于 2020-06-12 10:55 259次阅读
KUKA控制力的函数ACTIVATE_FORCE...

KUKA-C4机器人SWRITE函数的用法说明

SWRITE具有与CWRITE类似的功能和语法。但是,与CWRITE不同,SWRITE不会将数据写入....
发表于 2020-06-12 10:15 277次阅读
KUKA-C4机器人SWRITE函数的用法说明

制作一条KUKA-C4机器人的提示框!

用函数 Set_KrlDlg( ) 可生成一则对话信息。 这意味着,该信息提示被传递到信息缓存器中....
发表于 2020-06-12 09:40 251次阅读
制作一条KUKA-C4机器人的提示框!

C语言中对变量的使用需要注意的问题

只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更....
发表于 2020-06-09 10:39 197次阅读
C语言中对变量的使用需要注意的问题

linux中编译c语言的方法

以上就是linux中如何编译c语言的详细内容。
发表于 2020-06-09 08:58 83次阅读
linux中编译c语言的方法

各路大牛的C语言编程建议和技巧

对于清晰的程序来说,排版规范一向都是至关重要的。当然,众所周知最有用的是缩进,但是当墨水遮盖了意图时....
发表于 2020-06-08 17:05 219次阅读
各路大牛的C语言编程建议和技巧

C语言编程建议和技巧

对于变量名称,长度并不是名称的价值所在,清晰的表达才是。不常用的全局变量可能会有一个很长的名称,像 ....
发表于 2020-06-05 16:25 353次阅读
C语言编程建议和技巧

教你怎么写出让同事无法维护的代码

使用相似的变量名。如:单词相似,swimmer 和 swimner,字母相似:ilI1| 或 oO0....
发表于 2020-06-05 16:20 291次阅读
教你怎么写出让同事无法维护的代码

为什么C语言不会过时?

先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜,从这个排....
发表于 2020-06-05 16:12 412次阅读
为什么C语言不会过时?