C语言宏定义使用技巧

时间:2022-08-09 07:50:06 其他范文 收藏本文 下载本文

C语言宏定义使用技巧(共10篇)由网友“沈听白”投稿提供,以下是小编帮大家整理后的C语言宏定义使用技巧,仅供参考,欢迎大家阅读。

C语言宏定义使用技巧

篇1:C语言宏定义使用技巧

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等,下面列举一些成熟软件中常用得宏定义……

1,防止一个头文件被重复包含

#ifndef COMDEF_H

#define COMDEF_H

//头文件内容

#endif

2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。

typedef unsigned char boolean; /* Boolean value type. */

typedef unsigned long int uint32; /* Unsigned 32 bit value */

typedef unsigned short uint16; /* Unsigned 16 bit value */

typedef unsigned char uint8; /* Unsigned 8 bit value */

typedef signed long int int32; /* Signed 32 bit value */

typedef signed short int16; /* Signed 16 bit value */

typedef signed char int8; /* Signed 8 bit value */

//下面的不建议使用

typedef unsigned char byte; /* Unsigned 8 bit value type. */

typedef unsigned short word; /* Unsinged 16 bit value type. */

typedef unsigned long dword; /* Unsigned 32 bit value type. */

typedef unsigned char uint1; /* Unsigned 8 bit value type. */

typedef unsigned short uint2; /* Unsigned 16 bit value type. */

typedef unsigned long uint4; /* Unsigned 32 bit value type. */

typedef signed char int1; /* Signed 8 bit value type. */

typedef signed short int2; /* Signed 16 bit value type. */

typedef long int int4; /* Signed 32 bit value type. */

typedef signed long sint31; /* Signed 32 bit value */

typedef signed short sint15; /* Signed 16 bit value */

typedef signed char sint7; /* Signed 8 bit value */

3,得到指定地址上的一个字节或字

#define MEM_B( x ) ( *( (byte *) (x) ) )

#define MEM_W( x ) ( *( (word *) (x) ) )

4,求最大值和最小值

#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

5,得到一个field在结构体(struct)中的偏移量

#define FPOS( type, field )

/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

6,得到一个结构体中field所占用的字节数

#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

7,按照LSB格式把两个字节转化为一个Word

#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8,按照LSB格式把一个Word转化为两个字节

#define FLOPW( ray, val )

(ray)[0] = ((val) / 256);

(ray)[1] = ((val) & 0xFF)

9,得到一个变量的地址(word宽度)

#define B_PTR( var ) ( (byte *) (void *) &(var) )

#define W_PTR( var ) ( (word *) (void *) &(var) )

10,得到一个字的高位和低位字节

#define WORD_LO(***) ((byte) ((word)(***) & 255))

#define WORD_HI(***) ((byte) ((word)(***) >> 8))

11,返回一个比X大的最接近的8的倍数

#define RND8( x ) ((((x) + 7) / 8 ) * 8 )

12,将一个字母转换为大写

#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13,判断字符是不是10进值的数字

#define DECCHK( c ) ((c) >= '0' && (c) <= '9')

14,判断字符是不是16进值的数字

#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||

((c) >= 'A' && (c) <= 'F') ||

((c) >= 'a' && (c) <= 'f') )

15,防止溢出的一个方法

#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

16,返回数组元素的个数

#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

#define MOD_BY_POWER_OF_TWO( val, mod_by )

( (dword)(val) & (dword)((mod_by)-1) )

18,对于IO空间映射在存储空间的结构,输入输出处理

#define inp(port) (*((volatile byte *) (port)))

#define inpw(port) (*((volatile word *) (port)))

#define inpdw(port) (*((volatile dword *)(port)))

#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))

#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))

#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

19,使用一些宏跟踪调试

A N S I标准说明了五个预定义的宏名,

它们是:

_ L I N E _

_ F I L E _

_ D A T E _

_ T I M E _

_ S T D C _

如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序

也许还提供其它预定义的宏名。

_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。

_ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。

源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时:分:秒。

篇2:c语言学习技巧

一、课本

无论用的是什么书,要学好C语言,把书上的每一个例题、习题的代码读懂,这是学C最基本的要求。弄懂每一章的内容是什么?在C语言中有什么用?并尝试修改每一个例题的代码,采用不同的代码来实现题目的要求。

二、课堂

在每一节课上,注意老师讲的内容,有的知识,老师稍微提点,你就能弄懂,但是自己看书,或许你几天也弄不懂。老师更能清晰地让你明白所要求掌握的知识点。在课堂上,尽可能多的在草稿纸上写下你自己的代码,让老师看或是自己上机调试。

三、笔记

无论学习什么知识,笔记是重点,俗话说:好记性不如烂笔头。一个认真学习的人,总是记了很多笔记的,想学好编程,你的笔记本上总有课本上的每一个例题代码的核心部分。以及八大经典的算法举例,递推、递归、穷举、贪心、分治、动规、迭代、分枝。

四、交流

想学好C语言,交流是必须的,尤其是学习C语言的新手,这里,我向大家推介百度C语言贴吧,这里有很多的学习者,也有很多高手,在这里你能学到课本以及课堂上学不到的东西。和他人交流也是很重要的。

五、上机练习

这是学习好C语言的关重要的环节,无论你编程学得多好,上机实现才是目的,所以,不怕要辛苦,把你的每一段代码都敲进计算机,让计算机来实现,这样有助于你对程序的理解,并试着修改你的代码,让你的代码更精简,效率更高。平时没事的时候,在计算机上多敲代码,一个编程厉害的高手,他的计算机上会有多代码。

想成为编程高手的军规:

1、大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘!

2、编程不是技术活,而是体力活。

3、C语言是基础,很重要,如果你不学好C语言,那么什么高级语言你都学不好。

4、计算机专业是一个很枯燥的专业,但即来之、则安之,只要你努力学,也会发现其中的乐趣。

5、学习编程的秘诀是:编程,编程,再编程。

C语言的读书心得篇2说到我学习C语言时,真是用千言万语呀!记得刚开始学的时候,我的C语言学的并不是很好,学期都过了快一半了,对C语言还是一知半解的,我是第四小组的组长,组长的职位给我了很大的压力,我一直认为做学问都要做到这一点,要么做到最好,要么就不去做它,本着这样一个心太,我下了一个决心就是要学好C语言,开始我用了最笨的方法,就是一个厚厚的本子,一支笔,一本C语言书,天天有事没事抄程序,不管什么程序,我都不放过,一个一个的抄,抄了有好几个本,回到宿舍就在机子上调程序,一个月过去了,老师让做C语言项目,是一个学生成绩管理系统,在当时这样一个项目对我们来说真是难度不小,可是我本着一个试一试的心太去做了,一个打死我都不敢相信的奇迹出现了,这个程序我写出来了,而且几乎是一气合成,而且只用了一个晚上的时间,写了足足有六页的代码,看着写在本子上的代码我有点不相信,这怎么可能呢,当晚我没有睡着觉,高兴啊,谁能睡的着。做这个项目让我明白了一些道理,再大的程序也是有不同的小程序组成的,因为我天天抄程序,抄的全是小程序,做这个大点的程序的时候我发现全是一个一个的小程序,抄了一个月的程序,当然能很顺利的就写出来了。

后来我明白了,抄程序是最笨的方法但我认为它是进步最快的方法,抄程序是积累经验的时候,而做项目才是真正把所学为所用的时候,可以说只有你做一个大点的项目出来才能真正是说明你学到了东西,你会用所学的东西,要不然就算你学的再多,不会用也没用啊,我还发现有很多同学,在学飞C语言的时候比我学的要好,可是他们却做不出来项目,就是说学会了但是不会用,那我说还不如不学呢。有点浪费时间。做学问特别是计算机一定要做的精准,比如说一个语句一个关键字,你一定要把它几乎所有的用方法都能清楚明白,比如说print语句,对于它你一定要明白什么时候用,这些你都要非常的清楚明白,要不然说不定那一天你用会碰上麻烦事,一句话要学精了,语法掌握住了,接下来就是写程序了,其实抄程序并不是说一直没有目的去抄,你会发现当你抄一段时间以后就不用再抄了,因为大部分都是一样的你一看就知道怎么写了,当你一看到程序就知道它什么功能,那里有错的时候,那你的成绩可是进步不小啊,这并不需要太多的时间,只要你用心一个月足够了。

跟大家说几点经验1.在学习的时候一定要注意这几点,不会的一定要问明白,不管谁能让他教会你知识就是你的了,要学会让知识为我所用。在看书的时候一定要做好标记,特别是不懂的地方一定要标明是什么意思。

2.在学习语言的时候一定要记住动手,不要只说不做,这样会行成眼高手低,不管什么样的程序都要亲手做过才能说会了,不要整天说我不会学不会,其实是你不想学,只是你下决心抄一个月程序,我保证我能有大的进步,其实当你抄到一周到两周的时候你就会特想抄,因为你会发现程序你能看懂了,能帮别人调程序了,有一种成就感呀!它会让你更加努力的去学习。

3.再一点是我建议大家在上课的时候少看课本,课本要在下课的时候看特别是上课前一定要先看看课本,上课的时候呢就不要看了,不要老师讲到那个问题了你马上在书上找,这样不好,会影响你的注意力,其实还真不如注意听老师讲呢?因为你要是一边听一边看课本,你是看到了书上的答案但是老师的思路你没有听到,而要是你不看的话,你听明白了思路,一定是想迫切的看到结果,这个时候看课本才是记的最死的时候,学习要的是就是个效率吗?

4.提醒大家学习要讲效率,我发现有很多同学天天学习,每天最早到教室,走的又最晚,别人玩他在学,别人学他也学,可是别的一天30%的学习时间却比他们一天50%以上的学习时间的效率要高上不仅仅是几倍的问题,所以我要说的是不要对别人说你天天在学习,要说你天天在进步,学习不是要你学习了多久是,是要你学了多少东西的,你学一小时还没有别人学一分钟的效率高,难道自己不是浪费时间吗?不想学的时候就不要学,出去玩一会儿再来学说不定会有更好的效果。希望这些经验能跟大家分享一下,最后还是要跟大家强调一点,抄程序是学好C语言的最好最快的方法。

C语言的读书心得篇3在科技高度发展的今天,计算机在人们之中的作用越来越突出。而c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要。

在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,更多的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。

由于时间的关系,我们的这次实践课程老师并没有给我们详细的介绍,只是给我们简单的介绍了几个比较重要的实际操作。包括了程序模块处理.简单界面程序.高级界面程序.程序的添加修改.用程序做一元线性回归处理以及用c语言程序来画粒度分布图等这几样比较重要的时间操作。

上机实验是学习程序设计语言必不可少的实践环节,特别是c语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。

学习c程序设计语言除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。因为学时所限,课程不能安排过多的统一上机实验,所以希望学生有效地利用课程上机实验的机会,尽快掌握用c语言开发程序的能力,为今后的继续学习打下一个良好的基矗为此,我们结合课堂讲授的内容和进度,安排了12次上机实验。课程上机实验的目的,不仅仅是验证教材和讲课的内容、检查自己所编的程序是否正确,课程安排的.上机实验的目的可以概括为如下几个方面:

1.加深对课堂讲授内容的理解

课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。

学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题。即把c语言作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握c语言、自己编写的程序是否能够正确地解题。

通过上机实验来验证自己编制的程序是否正确,恐怕是大多数同学在完成老师作业时的心态。但是在程序设计领域里这是一定要克服的传统的、错误的想法。因为在这种思想支配下,可能你会想办法去掩盖程序中的错误,而不是尽可能多地发现程序中存在的问题。自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对c语言的理解和程序开发能力。

2.熟悉程序开发环境、学习计算机系统的操作方法

一个c语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。所谓环境就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进行程序开发工作。通过上机实验,熟练地掌握c语言开发环境,为以后真正编写计算机程序解决实际问题打下基矗同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。

3.学习上机调试程序

完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。

通过这次为数不多的几天计算机实践学习,我们了解了一些关于c语言的知识,理解巩固了我们c语言的理论知识,着对我们将来到社会工作将会有莫大的帮助。同时它让我知道,只要你努力,任何东西都不会太难。

篇3:C语言变长消息定义:柔性数组

在游戏前后端交换的过程中,经常会用到变成的消息体,因为有的内容的大小是位置的,例如一条微博,微博的内容大小是未知的,

一般的做法是定义一个char*类型的指针,然后指定其长度,代码如下:

typedef struct{ unsigned len; char* pData;}Msg;

使用的时候是这样的:

char str[] = “hello world!”; unsigned len = sizeof(str); Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char)); m->len = len; m->pData = (char*)(m+1); memcpy(m+1, str, len); printf(“%d, %sn”, m->len, m->pData);

有没有觉得时机上char* pData很多余呢?

因为数据时机的存储位置在m+1,我们可以直接得到这个指针,而不需要重新定义一个char* pData来报错这个位置。

这样带来了另一个问题就是,访问不方便,我们不能用结构体成员的方式来访问了,可以使用柔性数组,且看:

typedef struct{ unsigned len; char data[];}Message;

使用起来就是这样的:

Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char)); msg->len = len; memcpy(msg->data, str, len); printf(“%d, %sn”, msg->len, msg->data); free(msg);

来分完整代码对比下:

// array0.h

typedef struct{ unsigned len; char* pData;}Msg;typedef struct{ unsigned len; char data[];}Message;

// main.c

// test for 0 size array#include#include#include#include “array0.h”int main{ char str[] = “hello world!”; unsigned len = sizeof(str); // 普通用法 Msg* m = (Msg*)malloc(sizeof(Msg)+len*sizeof(char)); m->len = len; m->pData = (char*)(m+1); memcpy(m+1, str, len); printf(“%d, %sn”, m->len, m->pData); free(m); // 柔性数组 Message* msg = (Message*)malloc(sizeof(Message) + len*sizeof(char)); msg->len = len; memcpy(msg->data, str, len); printf(“%d, %sn”, msg->len, msg->data); free(msg); system(“pause”); return 0;}

篇4:c语言 可变参数的使用

主要涉及函数

va_list ap 声明一个指针

va_start(ap,arg) 将ap指向到最后一个确定的参数arg

va_arg(ap,size) 将ap储存的地址加size,指向下一个参数

va_end(ap) 将ap赋值为NULL

#include#includeint sum(int, ...);int main(void){ printf(Sum of 10, 20 and 30 = %d, sum(3, 10, 20, 30) ); printf(Sum of 4, 20, 25 and 30 = %d, sum(4, 4, 20, 25, 30) ); return 0;}int sum(int num_args, ...){ int val = 0; va_list ap; //指向参数的指针 int i; va_start(ap, num_args); //将指针ap指向最后一个确定的参数 for(i = 0; i < num_args; i++) {val += va_arg(ap, int); //va_arg(),将指针ap指向可变参数的首地址 } va_end(ap); //将指针ap赋值为NULL return val;}

运行结果:

10、20 和 30 的和 = 60

4、20、25 和 30 的和 = 79

篇5:计算机二级C语言考试技巧

1.笔试试卷分析

笔试试卷由选择题和填空题组成。选择题和填空题一般对基本知识和基本操作进行考查,它主要是测试我们对相关概念的掌握是否全面、理解是否准确、思路是否清晰。

(1)选择题分析

选择题为单选题,是客观题,每道题的分值为2分,试题覆盖面广,一般情况下我们不可能做到对每个题目都有把握答对。考试时就需要我们学会放弃,对于不确定的题目不要在上面花费太多的时间,先记住,然后作答其他题目。等最后有空余的时间再回过头来仔细考虑这些题目。二级C语言笔试题目众多,分值分散,我们一定要有全局观,合理地安排考试时间。

选择题一般分为:正面试题和反面试题。设问是正确观点的题称为正面试题,绝大多数选择题为正面试题;设问是是错误观点的题称为反面试题。我们在解答选择题时可以如下几个答题方法来答题,这样可以提高答题速度和准确率。

① 顺选法:如果对题中的4个选项,一看就能肯定其中的1个是正确的,就可以直接得出答案。对于一些比较容易看出正确选项的题,可以使用排除错误选项。

② 排除法:排除法是将错误答案一一排除的方法。对题中的4个选项逐个去掉错误的选项。对于一些比较容易看出错误选项的题,可以使用排除错误选项。

③ 比较法:这种办法是没有办法的办法,如果有些题实在是没有把握,那么就只有比较四个选项中那个更接近题目要求了(这也称之为“蒙猜法”)。

(2)填空题分析

填空填一般难度都比较大,一般需要我们准确地填入字符,往往需要非常精确,错一个字也不得分。在分值方面,每题也是2分。在作答填空题时要注意以几点:

① 答案要写得简洁明了,尽量使用专业术语。

② 认真填写答案,字迹要工整、清楚,格式要规范、正确,在把答案往答题卡上填写后尽量不要涂改。

③ 注意,在答题卡上填写答案时,一定要注意题目的序号,不要弄错位置。

④ 对于有两种答案的情况,只需填一种即可,多填并不多给分。

2.上机试题分析

上机考试重点考察我们综合运用基础的操作能力和程序编写能力,要求我们具有综合运用基础知识进行实际操作的能力。上机试题综合性强、难度较大。上机考试的评分是以机评为主,人工复查为辅的。机评不存在公正性的问题,却存在呆板的问题,有时还可能因为出题者考虑不周出现错评的情况。这就要求我们做题时要充分考虑到各种情况,尽可能的按规范编写程序,否则有可能答对不得分。

掌握好上机考试的考试技巧,可以使我们的实际水平在考试时得到充分发挥,从而取得较为理想的成绩。历次考试均有考生因为忽略了考试技巧,加之较为紧张的考场气氛影响了水平的发挥,致使考试成绩大大低于实际水平。所以,在考试时不要急燥、慌张,而是要认真、冷静地看清题目要求,在做完题后一定要保存文件,并运行程序检测运行结果是否符合题目要求。在考完交卷前先关闭掉C语言编程软件和其他打开的文件,再交卷,确保交卷过程中不出错误。

3、综合应试技巧

(1)认真审题,先分析,后下笔。试题的考核是有针对性的,因此在答题时也要有针对性。解答前,除了要看清问题外,还要弄清楚题目考核的意图。明白了问在那里后,就可以开始考虑好如何答题了,然后依思路从容做答。

(2)对于十分了解或熟悉的问题,切忌粗心大意、得意忘形,一定要认真看题、分析,避免掉入陷阱,确定后再写出答案。

(3)对于偶尔碰到或是虽然在复习中见过但已记不清的题目,也不要泄气,将自己的判断同书本知识联系起来做答;对于完全陌生的问题,实在不知如何根据书本知识进行解答时,可以采用“蒙猜法”,用自己的思考和逻辑推断作答。由于这这方法作出来的题没有多大把握得分,因此不要花费太多时间去研究它。

总之,考试要取得好成绩,取决于我们对C语言知识掌握的扎实程度。否则,即使有再好的技巧也无济于事,只能碰运气,这是不可能考出好成绩的。当然,在有扎实的基础上运用一些应试的技巧,能使考试起到事半功倍的效果。

1.计算机二级考试《C语言》上机答题技巧

2.计算机二级C语言考试必看技巧

3.计算机考试二级C语言考试技巧

4.计算机二级c语言试题

5.计算机二级C语言考试复习五要点

6.计算机二级C语言考试考什么

7.计算机二级考试试题C语言冲刺试题

8.计算机二级C语言程序设计考试内容

9.全国计算机等级考试二级c语言

10.计算机二级《C语言》基础练习题及答案

篇6:C语言怎样定义和声明全局变量和函数最好

C语言怎样定义和声明全局变量和函数最好

首先, 尽管一个全局变量或函数可以(在多个编译单元中) 有多处“声明”, 但是“定义” 却只能允许出现一次,定义是分配空间并赋初值(如果有) 的声明。

最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的`一致性。这条规则提供了高度的可移植性: 它和ANSI C 标准一致, 同时也兼容大多数ANSI 前的编译器和连接器,

Unix 编译器和连接器通常使用“通用模式” 允许多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C 标准称这种行为为“公共扩展”, 没有语带双关的意思。

可以使用预处理技巧来使类似DEFINE(int, i);的语句在一个头文件中只出现一次, 然后根据某个宏的设定在需要的时候转化成定义或声明。

但不清楚这样的麻烦是否值得。如果希望让编译器检查声明的一致性, 一定要把全局声明放到头文件中。特别是, 永远不要把外部函数的原型放到.c 文件中: 通常它与定义的一致性不能得到检查, 而矛盾的原型比不用还糟糕。

篇7:C语言内存使用的常见问题及解决之道

一 前言

本文所讨论的“内存”主要指(静态)数据区、堆区和栈区空间(详细的布局和描述参考《Linux虚拟地址空间布局》一文),数据区内存在程序编译时分配,该内存的生存期为程序的整个运行期间,如全局变量和static关键字所声明的静态变量。函数执行时在栈上开辟局部自动变量的储存空间,执行结束时自动释放栈区内存。堆区内存亦称动态内存,由程序在运行时调用malloc/calloc/realloc等库函数申请,并由使用者显式地调用free库函数释放。堆内存比栈内存分配容量更大,生存期由使用者决定,故非常灵活。然而,堆内存使用时很容易出现内存泄露、内存越界和重复释放等严重问题。

二 内存问题

2.1 数据区内存

2.1.1 内存越界

内存越界访问分为读越界和写越界。读越界表示读取不属于自己的数据,如读取的字节数多于分配给目标变量的字节数。若所读的内存地址无效,则程序立即崩溃;若所读的内存地址有效,则可读到随机的数据,导致不可预料的后果。写越界亦称“缓冲区溢出”,所写入的数据对目标地址而言也是随机的,因此同样导致不可预料的后果。

内存越界访问会严重影响程序的稳定性,其危险在于后果和症状的随机性。这种随机性使得故障现象和本源看似无关,给排障带来极大的困难。

数据区内存越界主要指读写某一数据区内存(如全局或静态变量、数组或结构体等)时,超出该内存区域的合法范围。

写越界的主要原因有两种:1) memset/memcpy/memmove等内存覆写调用;2) 数组下标超出范围。

复制代码

1 #define NAME_SIZE 5

2 #define NAME_LEN NAME_SIZE-1/*Terminator*/

3 char gszName[NAME_SIZE] = “Mike”;

4 char *pszName = “Jason”;

5 int main(void)

6 {

7  memset(gszName, 0, NAME_SIZE+1); //越界1

8  gszName[NAME_SIZE] = 0;     //越界2

9

10  if(strlen(pszName) <= NAME_SIZE) //越界3(注意'='号)

11    strcpy(gszName, pszName);

12

13  int dwSrcLen = strlen(pszName);

14  if(dwSrcLen < NAME_SIZE)

15    memcpy(gszName, pszName, dwSrcLen); //未拷贝结束符('')

16

17  return 0;

18 }

复制代码

使用数组时,经常发生下标“多1”或“少1”的操作,特别是当下标用于for循环条件表达式时。此外,当数组下标由函数参数传入或经过复杂运算时,更易发生越界。

复制代码

1 void ModifyNameChar(unsigned char ucCharIdx, char cModChar)

2 {

3  gszName[ucCharIdx] = cModChar; //写越界

4 }

5 int main(void)

6 {

7  ModifyNameChar(5, 'L');

8  unsigned char ucIdx = 0;

9  for(; ucIdx <= NAME_SIZE; ucIdx++) //'='号导致读越界

10    printf(“NameChar = %cn”, gszName[ucIdx]);

11

12  return 0;

13 }

复制代码

对于重要的全局数据,可将其植入结构体内并添加CHK_HEAD和CHK_TAIL进行越界保护和检查:

复制代码

1 #define CODE_SIZE   4 //越界保护码的字节数

2 #if (1 == CODE_SIZE)

3  #define CODE_TYPE char

4  #define CHK_CODE  0xCC   //除0外的特殊值

5 #elif (2 == CODE_SIZE)

6  #define CODE_TYPE short

7  #define CHK_CODE  0xCDDC  //除0外的特殊值

8 #else

9  #define CODE_TYPE int

10  #define CHK_CODE  0xABCDDCBA //除0外的特殊值

11 #endif

12 #define CHK_HEAD  CODE_TYPE ChkHead;

13 #define CHK_TAIL  CODE_TYPE ChkTail;

14 #define INIT_CHECK(ptChkMem) do{

15  (ptChkMem)->ChkHead = CHK_CODE;

16  (ptChkMem)->ChkTail = CHK_CODE;

17 }while(0)

18 #define CHK_OVERRUN(ptChkMem) do{

19  if((ptChkMem)->ChkHead != CHK_CODE || (ptChkMem)->ChkTail != CHK_CODE) {

20    printf(“[%s(%d)<%s>]Memory Overrun(ChkHead:0x%X,ChkTail:0x%X)!n”, __FILE__, __LINE__, FUNC_NAME,

21    (ptChkMem)->ChkHead, (ptChkMem)->ChkTail);

22  }

23 }while(0)

24 typedef struct{

25  CHK_HEAD;

26  char szName[NAME_SIZE];

27  CHK_TAIL;

28 }T_CHK_MEM;

29 T_CHK_MEM gtChkMem;

30 int main(void)

31 {

32  memset(>ChkMem, 0, sizeof(T_CHK_MEM));

33  INIT_CHECK(>ChkMem);

34

35  memset(>ChkMem, 11, 6);

36  CHK_OVERRUN(>ChkMem);

37  strcpy(gtChkMem.szName, “Elizabeth”);

篇8:C语言如何决定使用那种整数类型

C语言如何决定使用那种整数类型

如果需要大数值(大于32, 767 或小于?32, 767), 使用long 型,否则, 如果空间很重要(如有大数组或很多结构), 使用short 型。除此之外, 就使用int 型。如果严格定义的溢出特征很重要而负值无关紧要, 或者你希望在操作二进制位和字节时避免符号扩展的'问题, 请使用对应的无符号类型。但是, 要注意在表达式中混用有符号和无符号值的情况。

尽管字符类型(尤其是无符号字符型) 可以当成“小” 整型使用, 但由于不可预知的符号扩展和代码增大有时这样做可能得不偿失,

使用无符号字符型有所帮助;

在选择浮点型和双精度浮点型时也有类似的权衡。但如果一个变量的指针必须为特定的类型时, 以上规则不再适用。

如果因为某种原因你需要声明一个有严格大小的变量, 确保象C99 的 那样用某种适当的typedef 封装这种选择。通常, 这样做唯一的好原因是试图符合某种外部强加的存储方案

篇9:计算机二级c语言考试高分技巧

1.笔试试卷分析

笔试试卷由选择题和填空题组成。选择题和填空题一般对基本知识和基本操作进行考查,它主要是测试我们对相关概念的掌握是否全面、理解是否准确、思路是否清晰。

(1)选择题分析

选择题为单选题,是客观题,每道题的分值为2分,试题覆盖面广,一般情况下我们不可能做到对每个题目都有把握答对。考试时就需要我们学会放弃,对于不确定的题目不要在上面花费太多的时间,先记住,然后作答其他题目。等最后有空余的时间再回过头来仔细考虑这些题目。二级C语言笔试题目众多,分值分散,我们一定要有全局观,合理地安排考试时间。

选择题一般分为:正面试题和反面试题。设问是正确观点的题称为正面试题,绝大多数选择题为正面试题;设问是是错误观点的题称为反面试题。我们在解答选择题时可以如下几个答题方法来答题,这样可以提高答题速度和准确率。

① 顺选法:如果对题中的4个选项,一看就能肯定其中的1个是正确的,就可以直接得出答案。对于一些比较容易看出正确选项的题,可以使用排除错误选项。

② 排除法:排除法是将错误答案一一排除的方法。对题中的4个选项逐个去掉错误的选项。对于一些比较容易看出错误选项的题,可以使用排除错误选项。

③ 比较法:这种办法是没有办法的办法,如果有些题实在是没有把握,那么就只有比较四个选项中那个更接近题目要求了(这也称之为“蒙猜法”)。

(2)填空题分析

填空填一般难度都比较大,一般需要我们准确地填入字符,往往需要非常精确,错一个字也不得分。在分值方面,每题也是2分。在作答填空题时要注意以几点:

① 答案要写得简洁明了,尽量使用专业术语。

② 认真填写答案,字迹要工整、清楚,格式要规范、正确,在把答案往答题卡上填写后尽量不要涂改。

③ 注意,在答题卡上填写答案时,一定要注意题目的序号,不要弄错位置。

④ 对于有两种答案的情况,只需填一种即可,多填并不多给分。

2.上机试题分析

一个C语言源程序总是在一定的硬件和软件环境支持下进行编辑、编译、连接和运行的,而这其中的每一步都直接影响程序调试的效率。所以初学者必须了解所使用的计算机系统的基本操作方法,学会使用该系统,了解在该系统上如何编辑、编译、连接和运行一个C语言程序。

上机考试重点考察我们综合运用基础的操作能力和程序编写能力,要求我们具有综合运用基础知识进行实际操作的能力。上机试题综合性强、难度较大。上机考试的评分是以机评为主,人工复查为辅的。机评不存在公正性的问题,却存在呆板的问题,有时还可能因为出题者考虑不周出现错评的情况。这就要求我们做题时要充分考虑到各种情况,尽可能的按规范编写程序,否则有可能答对不得分。

掌握好上机考试的考试技巧,可以使我们的实际水平在考试时得到充分发挥,从而取得较为理想的成绩。历次考试均有考生因为忽略了考试技巧,加之较为紧张的考场气氛影响了水平的发挥,致使考试成绩大大低于实际水平。因此我们在考试前,要有充分的准备。总结起来有以下几点供我们在复习和考试时借鉴:

(1)上机考试训练时,一定不要死记硬背。以往有部分考生能够顺利通过笔试,却不能通过上机考试,主要原因就是她们在平时训练时死记硬背,而没有真正的理解知识应用,到考试时,题目稍有变动就变的束手无策。所以我们一定要在熟记基本知识点的基础上,加强上机训练,做到真正理解、掌握解题方法和思路。

(2)一定要重视考试模拟软件的使用。应使用考试模拟软件进行实际的上机操作练习,尤其要做一些具有针对性的上机模拟题,以便熟悉考试题型,体验真实的上机环境,减轻考试时的紧张程度。

(3)学会并习惯使用编程软件的帮助系统。C语言编程软件有非常全面的帮助系统,熟练掌握、使用帮助系统,可以使我们减少记忆量,解决解题中的陌生、疑难问题。

(4)熟悉考试场地及环境,尤其是要熟悉考场的硬件情况和所使用的相关软件的情况。一般在正式考试前,考点会给我们提供一次模拟上机的机会,应尽可能地去参加。模拟考试时,不要把重点放在做题上,而应放在熟悉考试环境,相应软件的使用方法,考试系统的使用等方面。

(5)在考试时不要急燥、慌张,而是要认真、冷静地看清题目要求,在做完题后一定要保存文件,并运行程序检测运行结果是否符合题目要求。在考完交卷前先关闭掉C语言编程软件和其他打开的文件,再交卷,确保交卷过程中不出错误。

3、综合应试技巧

(1)认真审题,先分析,后下笔。试题的考核是有针对性的,因此在答题时也要有针对性。解答前,除了要看清问题外,还要弄清楚题目考核的意图。明白了问在那里后,就可以开始考虑好如何答题了,然后依思路从容做答。

(2)对于十分了解或熟悉的问题,切忌粗心大意、得意忘形,一定要认真看题、分析,避免掉入陷阱,确定后再写出答案。

(3)对于偶尔碰到或是虽然在复习中见过但已记不清的题目,也不要泄气,将自己的判断同书本知识联系起来做答;对于完全陌生的问题,实在不知如何根据书本知识进行解答时,可以采用“蒙猜法”,用自己的思考和逻辑推断作答。由于这这方法作出来的题没有多大把握得分,因此不要花费太多时间去研究它。

总之,考试要取得好成绩,取决于我们对C语言知识掌握的扎实程度。否则,即使有再好的技巧也无济于事,只能碰运气,这是不可能考出好成绩的。当然,在有扎实的基础上运用一些应试的技巧,能使考试起到事半功倍的效果。

1.计算机二级C语言考试技巧

2.计算机二级考试《C语言》上机答题技巧

3.计算机二级C语言考试必看技巧

4.计算机考试二级C语言考试技巧

5.计算机二级c语言试题

6.计算机二级C语言每日练习

7.计算机二级C语言复习建议

8.计算机二级考试C语言模拟练习

9.计算机二级C语言考试冲刺练习

10.计算机二级C语言考试复习五要点

篇10:计算机二级C语言考试必看技巧

全国计算机等级考试二级C语言上机考试具有三种题型:程序填空、程序修改和程序设计,其中程序填空30分,程序修改30分,程序设计40分。从以往的机试的情况来看,许多考生在程序设计题目上失分比较严重,而程序设计题占总分值的40%,一旦答错,如果程序填空和程序修改又不能取得满分的话,就不能通过上机考试。

2007年9月,教育部考试中心对现有的全国计算机等级考试大纲进行了改革,二级C语言上机考试时间由60分钟增加到了90分钟,编程环境由以前的TC2.0改为VC++6.0。本文根据对近几年来二级C语言上机考试中的程序设计题进行归类总结,提出相应的策略,并对考生应对2007新大纲以后的C语言上机环境给出一些建议。

C/C++常用预处理指令

C语言中的复数C基础

excel中如何自定义函数

编程毕业论文范文大全

计算机二级access练习题

工作计划模板电子表格

vba心得体会

Word 的使用技巧

言语交互性的跨文化分析

软件开发笔试题目

C语言宏定义使用技巧
《C语言宏定义使用技巧.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【C语言宏定义使用技巧(共10篇)】相关文章:

计算机等级考试(三级PC技术)考试大纲2023-06-05

面试网络工程师的题目2022-09-08

c语言函数知识点总结2023-04-03

0202 日的学习内容Windows系统2023-04-22

低调陈述在商务谈判语言中的运用2023-05-18

Excel表格多个经典操作2022-08-19

C语言内存使用的常见问题及解决之道2023-01-28

Excel会计应学鲜为人知的技巧2023-07-03

全国计算机等级考试二级MSOffice高级应用考试大纲2022-10-13

微软办公软件Office经典故障解决方法2022-12-20

点击下载本文文档