文档章节

Expert C Programming阅读札记

h
 hiker_urey
发布于 2015/10/18 16:33
字数 640
阅读 7
收藏 0
点赞 0
评论 0
  1. 不要使用函数库中没有对输入数据进行长度检查的函数。 在2.3.3节中展示了gets()在程序中可能导致的缓存越界问题,在现在的编程中应当使用fgets()来确保不会出现对输入长度无限制而导致缓存越界的问题。 因此在所有进行输入或内存拷贝等操作时,都应当使用对输入/拷贝长度进行限制的方法,避免出现越界bug。

  2. 声明 char* const*(*next)(); 的含义。

    A. next是一个指针;

    B. next是一个指向[函数]的指针;

    C. next是一个指向[返回一个[指针]的函数]的指针;

    D. next是一个指向[返回一个[指向类型为char的常量指针的指针]的函数]的指针;

  3. 使用typedef来帮助使声明更易懂。 在ANSI C标准中signal()的声明是:

void (*signal(int sig, void(*func)(int)))(int);
signal是一个函数函数;其返回类型为F,参数类型为int和void(\*func)(int);类型F为void\*(\*func)(int)。
可以有:
typedef void(*ptr_to_func)(int);
ptr_to_func signal(int , ptr_to_func);
这和signal的原始定义完全一致但显然更容易理解。
  1. typedef在对类型进行声明之后不能对声明后的类型进行扩展,这是与使用#define宏之间的显著区别。 例如:
#define dint32 int
 unsigned dint32 udi; 
 typedef int tint32;
 unsigned tint32 uti;  /* 非法! */

另一个区别可以在下面的例子中清晰的呈现出来:

 #define dint_ptr int*
 dint_ptr pA, pB;    /* 实际上可还原为 int* pA, pB; 导致pB类型为int而非int* */
 typedef int* tint_ptr;
 tint_ptr pC, pD;    /* pC和pD的类型均为int* */
  1. 进一步思考typedef。typedef实际上是创建了一个类型的别名,而这个别名的创建方式与变量声明的方式是相似的。
 typedef int (*array_ptr)[100];
 typedef int array[100];
 array_ptr pArr = NULL;
 printf("%d %d\n", sizeof(array_ptr), sizeof(*pArr));     /* 输出:4 400 */
 printf("%d \n", sizeof(array));                          /* 输出:400 */
  1. 大神警示:不要为了方便起见对结构使用typedef。对结构使用typedef唯一的好处是能够省略书写“struct”关键字,但是这个关键字可以可以提示一些信息,不应该被省略。

    typedef应该用在: - 数组、结构、指针以及函数的组合类型; - 可移植类型。例如若你需要一个20比特的类型,可以使用typedef来定义类型,当移植至不同平台时,修改typdef所定义的类型就可以了。

© 著作权归作者所有

共有 人打赏支持
h
粉丝 1
博文 15
码字总数 12905
作品 0
广州
程序员
推荐一些不错的计算机书籍

推荐一些不错的计算机书籍。 # PHP 《PHP程序设计》(第2版) --PHP语法和入门最好的书 《PHP5权威编程》 --PHP入门后升级书 《深入PHP:面向对象、模式与实践》(第3版) --理解PHP中的面向对象...

Junn ⋅ 2013/08/30 ⋅ 0

国外程序员推荐的免费编程书籍资源

StackOverflow 上有位网友(xenoterracide)提问: 我正试着搜集整理一个可在网上免费阅读的计算机编程书籍列表。这些书可以是某种特定编程语言,也可以计算机方面通用书籍。网上有哪些免费可...

职通网 ⋅ 2011/11/07 ⋅ 1

攻城狮修炼秘籍

漫漫校园生活,孜孜不倦的你,今天书多读一点! 把自己投入知识的海洋吧!为即将成为一名高冷俊俏的程序猿和媛而吹响最后的号角: 各类秘籍自助区 一、测试攻城狮 《软件测试》 《测试之道》...

SVD ⋅ 2016/09/10 ⋅ 0

如何熟悉一个开源项目?

你有个任务,需要用到某个开源项目;或者老大交代你一个事情,让你去了解某个东西。怎么下手呢?如何开始呢?我的习惯是这样: 1.首先,查找和阅读该项目的博客和资料,通过google你能找到某个...

xrzs ⋅ 2012/06/02 ⋅ 0

推荐的阅读及练手项目

关于作者: He is an expert in numerous languages including .NET, PHP, C/C++, Java and more 推荐阅读(Software development, Desktop, Web) http://www.coderslexicon.com/recommended......

cyper ⋅ 2015/11/10 ⋅ 0

转摘>

The following is from an EMail message that I sent to to an individual on 12-Apr-2001. You may find this EMail message useful. The Writer asked: Here is my reply: Thank you for ......

凌晨4点半 ⋅ 2014/10/27 ⋅ 0

【转】Oracle数据库相关的书籍推荐

文章转自:http://www.dbthink.com/?p=724 1.concepts guide(11g)By Thomas Kyte 由Tom担纲编写的11g的Concepts guide作为第一本书籍,是引领你进去Oracle世界的最基础的一本书籍,建议所有...

张玉涛 ⋅ 2012/09/05 ⋅ 0

天才从哪里来?(Where Does Talent Really Come From?)

有人发现,参加下个月世界杯的足球运动员大多数是上半年出生的。如果再把青年队算进去,这个规律就更明显了。最新一届英格兰青年队里,有一半选手出生在1月、2月和3月,另一半选手出生在其他...

阮一峰 ⋅ 2006/05/14 ⋅ 0

搞图像处理也得懂点编程

我刚进公司时,总是徘徊:一边是那么多没有学习的图像算法;一边是实际要用到的编程技法。我该先学什么,后学什么?其实我也没得到答案,还是需要什么学什么呗。我只知道,做图像算法的,不懂...

行之与亦安 ⋅ 2017/07/10 ⋅ 0

python 某代码校验文件时的出错

Python札记 -- 文件校验 http://www.cnblogs.com/PandaBamboo/archive/2013/05/10/3071233.html 新学python,在那看了篇文章,可以校验很大的文件 于是用3.4版本来写个例程试试看 # -- codin...

商某人 ⋅ 2014/05/19 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim编辑模式、命令模式

编辑模式 vim要从一般模式进入编辑模式只要按字母 i 、I、a、A、o、O键就可以了 要从编辑模式回到一般模式按键盘上的Esc键即可。 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 o ...

黄昏残影 ⋅ 27分钟前 ⋅ 0

OSChina 周五乱弹 —— 如果有一天不当程序员了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享off的单曲《我唱情歌给你听》 《我唱情歌给你听》- off 手机党少年们想听歌,请使劲儿戳(这里) @小小编辑 :#如果不做程序...

小小编辑 ⋅ 34分钟前 ⋅ 4

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部