大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C技巧 > 必须弄懂的495个C语言问题

必须弄懂的495个C语言问题(3)

关键词:弄懂语言  阅读(1591) 赞(17)

[摘要]本文是对必须弄懂的495个C语言问题的讲解,与大家分享。


在范围内没有声明就调用(可能是第一次调用在函数的定义之前) 的函数被认为返回整型(int) (且没有任何参数类型信息), 如果函数在后边声明或定义成其它类型就会导致矛盾。所有函数(非整型函数一定要) 必须在调用之前声明。另一个可能的原因是该函数与某个头文件中声明的另一个函数同名。


参见问题11.4 和15.1


参考资料: [K&R1, Sec. 4.2 p. 70]; [K&R2, Sec. 4.2 p. 72]; [ISO, Sec. 6.3.2.2];[H&S, Sec. 4.7 p. 101].


1.9 main() 的正确定义是什么? void main() 正确吗?


参见问题11.11 到11.16。(这样的定义不正确)。


1.10 对于没有初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”, 它可否作为空指针或浮点零?


具有“静态” 生存期的未初始化变量(即, 在函数外声明的变量和有静态存储类型的变量) 可以确保初始值为零, 就像程序员键入了“=0” 一样。因此, 这些变量如果是指针会被初始化为正确的空指针, 如果是浮点数会被初始化为0.0 (或正确的类型, 参见第5 章)。


具有“自动” 生存期的变量(即, 没有静态存储类型的局部变量) 如果没有显示地初始化, 则包含的是垃圾内容。对垃圾内容不能作任何有用的假设。这些规则也适用于数组和结构(称为“聚合体” ); 对于初始化来说, 数组和结构都被认为是“变量”。


用malloc() 和realloc() 动态分配的内存也可能包含垃圾数据, 因此必须由调用者正确地初始化。用calloc() 获得的内存为全零, 但这对指针和浮点值不一定有用(参见问题7.26 和第5 章)。


参考资料: [K&R1, Sec. 4.9 pp. 82-4]; [K&R2, Sec. 4.9 pp. 85-86]; [ISO, Sec.6.5.7, Sec. 7.10.3.1, Sec. 7.10.5.3]; [H&S, Sec. 4.2.8 pp. 72-3, Sec. 4.6 pp. 92-3,Sec. 4.6.2 pp. 94-5, Sec. 4.6.3 p. 96, Sec. 16.1 p. 386.]。

1.11 代码int f() { char a[] = "Hello, world!";} 不能编译。


可能你使用的是ANSI 之前的编译器, 还不支持“自动聚集”(automatic aggregates,即非静态局部数组、结构和联合) 的初始化。参见问题11.28。


1.12 这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非法初始式” 云云。


这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。


1.13 以下的初始化有什么区别?char a[] = "string literal"; char *p= "string literal"; 当我向p[i] 赋值的时候, 我的程序崩溃了。


字符串常量有两种稍有区别的用法。用作数组初始值(如同在char a[] 的声明中), 它指明该数组中字符的初始值。其它情况下, 它会转化为一个无名的静态字符数组, 可能会存储在只读内存中, 这就是造成它不一定能被修改。在表达式环境中, 数组通常被立即转化为一个指针(参见第6 章), 因此第二个声明把p 初始化成指向无名数组的第一个元素。
为了编译旧代码, 有的编译器有一个控制字符串是否可写的开关。


参见问题1.11、6.1、6.2 和6.6。


参考资料: [K&R2, Sec. 5.5 p. 104]; [ISO, Sec. 6.1.4, Sec. 6.5.7]; [Rationale,Sec. 3.1.4]; [H&S, Sec. 2.7.4 pp. 31-2]。


1.14 我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢?


用下面这样的代码
extern int func();
int (*fp)() = func;


当一个函数名出现在这样的表达式中时, 它就会“蜕变” 成一个指针(即, 隐式地取出了它的地址), 这有点类似数组名的行为。


通常函数的显示声明需要事先知道(也许在一个头文件中)。因为此处并没有隐式的外部函数声明(初始式中函数名并非一个函数调用的一部分)。


参见问题1.8 和4.8。

«上一页123下一页»


相关评论