c语言核心技术 二

来源:互联网 发布:网络电脑游戏排行榜 编辑:程序博客网 时间:2024/02/24 04:54
作者:刘旭晖 colorant@163.com转载请注明出处
http://blog.csdn.net/colorant/

================================================

malloc 和 calloc

calloc会把分配出来的内存中的每一个字节都初始化为0, 这可以保证不仅是将分配给结构对象的内存都初

始化为0,包括成员之间的Padding也是0

此外,个人觉得用Calloc的好处在于他能保证你分配出来的内存确实可用。因为malloc实际上只是预留出一

部分内存地址,在真正使用之前并不真正分配内存。 这可能导致你可以成功的分配很大的内存,结果发现

最后使用的时候OOM Out of Memory了。 有篇很好的文章详细的分析了这一问题:

http://www.linuxdevcenter.com/pub/a/linux/2006/11/30/linux-out-of-memory.html

================================================

fopen时的访问模式 r 和 w

很少在应用层编程,一直以为r就是读,w就是写,不能混用。 原来这不是最根本的区别,r+ 和 w+ 就是读

写都可以的。最更本的区别在于,如果一个文件不存在,r会失败,w会创建。如果一个文件已经存在 r模式

打开,w模式会打开并truncate(清空)

================================================

#include 头文件的嵌套层数限制

书上说是16层,也就是说一个头文件包含另一个头文件,不断的包含最多可以有16层的深度。
觉得少了一点,试了一下,用递归嵌套 1.h 包含2.h 2.h包含1.h

x86 上 gcc4.1.2 出错提示 #include nested too deeply 的时候,嵌套了198层,这个。。。真的足够用

了。


================================================

printf输出格式中,可以用变量来指定字段宽度,在位宽描述符的地方使用*,对应变量位置即可:

        char str[]="hello , guys";
        int width = 20;

        printf("%*s/n",width,str);

================================================

GCC:

想要得到GCC预处理一个文件的结果(插入头文件,展开宏),可以使用 -E 参数:

GCC -E -o file.i file.c

-C 参数可以保留源文件中的注释


用GCC输出汇编语言代码时,可以使用 -fverbose-asm 将C语言中的变量名作为汇编语言的注释。


逐行对比查看GCC如何把C语言翻译成汇编代码,这个应该挺有用:

gcc -g -o file.o -Wa,-a=file.asm,-L file.c

================================================

Makefile 中 =  :=  ?= 的区别:

= 递归展开,变量会原封不动的存储字符序列,知道被引用的时候再展开。
:= 简单展开,在变量赋值的时候就展开,后续修改对它赋值时引用的变量不影响它的值。
?= 如果变量原先没有赋值,则递归展开,否则不变。 这个应该比较常出现在判断变量是否已经在环境变量中被定义的情况。

如下Makefile

STR = "INIT"
STR2 = "INIT"
STR3 = "INIT"

NAME = "First"
STR = $(NAME)
STR2 := $(NAME)
STR3 ?= $(NAME)
STR4 ?= $(NAME)

NAME = "Second"

ALL:
        @echo $(STR)
        @echo $(STR2)
        @echo $(STR3)
        @echo $(STR4)

Make的输出结果是:

Second
First
INIT
Second

================================================