11月18日
第四章 连接
连接器并不理解C语言,然而它能理解机器语言和内存布局。作者强调连接器并不能处理连接时和C语言相关的一些错误,如果C语言提供了lint,要善加利用。
每个外部对象都必须在程序某个地方进行定义。这就意味着如果一个程序中包括了语句extern int a;就应该在别的某个地方包括语句int a;。同时为了免两次定义同一个外部对象(无论有无初值)可能引起的错误,唯一的解决办法是每个外部变量只定义一次。
static可以把变量和函数的作用域限制在一个源文件中,避免命名冲突。
函数必须在调用它之前进行定义或声明,否则它的返回类型就默认为整型,这样当它与函数连接时就会得到错误的结果。为了表明形参实参可能导致的错误,作者用在不同情形下可以接受不同类型的参数的函数printf和scanf举例来进行了说明。
#include <stdio.h>
int main()
{
int i;
char c;
for (i = 0; i < 5; i++) {
scanf("%d", &c);
printf("%d ",i);
}
return 0;
}
//一种可能的输出结果
//0 0 0 0 0 1 2 3 4
//而不是
//0 1 2 3 4
/*原因在于scanf期望读入一个指向整数的指针,然而得到的却是指向字符的指针。整数所占存储空间大于字符所占,所以字符c附近内存会被覆盖。可能的输出结果是c附近存放的是i的低端部分,每次输入都会覆盖为0*/