C语言(一)
时间:2011-04-29 来源:LuckyBool
学了这么久,突然觉得自己对C语言一点都没有掌握。这段时间抓紧看看C语言的基础问题。
加油!↖(^ω^)↗
觉得维基百科对C语言的介绍挺全面,并且也学到些东西。 链接:http://zh.wikipedia.org/wiki/C语言#.E5.86.85.E5.AD.98.E7.AE.A1.E7.90.86
1. 学了这么久,是否有想过C语言的特色到底有哪些。
- C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
- 传递参数是以值传递(Pass-by-value),也可以通过指针来传递参数(Pass-by-address)。
- 不同的变量类型可以用结构体(struct)组合在一起。
- 只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。
- 部份的变量类型可以转换,例如整型和字符型变量。
- 通过指针(pointer),C语言可以容易的对存储器进行低级控制。
- 编译预处理(preprocessor)让C语言的编译更具有弹性。
这些特色只有在不断的代码中去领悟、体会。
2. 内存管理
- C语言的特色之一是:程序员必须亲自处理内存的分配细节。
- C语言使用栈(Stack)来保存函数返回地址/栈祯基址、完成函数的参数传递和函数局部变量的存储。 如果程序需要在运行的过程中动态分配内存,可以利用堆(Heap)来实现。
- 基本上C程序的元素存储在内存的时候有3种分配策略:
静态分配
如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以 IA32 的 x86 平台及 gcc 编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端。
自动分配
函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。
所以说C函数永远不应该返回一个局部变量的地址。
要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。
动态分配
还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C 定义的堆操作函数是malloc、calloc、realloc和free。
使用堆(Heap)内存将带来额外的开销和风险。
3.安全问题
C语言的特色之一是:语言不负责内存边界检查。
以上是摘自维基百科让我觉得有些收获的内容。
相关阅读 更多 +