Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96395
  • 博文数量: 42
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-02 15:09
文章分类
文章存档

2012年(42)

最近访客

分类:

2012-02-02 15:34:56

原文地址:C语言18个经典问题答录 作者:

1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非法初始式” "初始化变量不是常数"等等。

答: 这个声明是静态或非局部变量吗?
      函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。
      因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请
      的内存地址是在运行时确定的。

2. *p++ 自增p 还是p 所指向的变量?

答:后缀++ 和-- 操作符本质上比前缀一目操作的优先级高,
    因此*p++ 和*(p++) 等价, 它自增p 并返回p 自增之前所指向的值
    要自增p 指向的值, 使用(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。


3. 我的strcat() 不行.我试了char *s1 = "Hello, "; char *s2 = "world!";  
char *s3 = strcat(s1, s2); 但是我得到了奇怪的结果。

答:这里主要的问题是没有正确地为连接结果分配空间。C 没有提供自动管理的字符串类型。
C 编译器只为源码中明确提到的对象分配空间(对于字符串, 这包括字符数组和串常量)。
程序员必须为字符串连接这样的运行期操作的结果分配足够的空间,  常可以通过声明数组或调用malloc() 完成。strcat() 不进行任何分配; 第二个串原样不动地附加在第一个之后。
因此, 一种解决办法是把第一个串声明为数组:
char s1[20] = "Hello, ";
由于strcat() 返回第一个参数的值, 本例中为s1, s3 实际上是多余的; 在strcat() 调用之后, s1 包含结果。
提问中的strcat() 调用实际上有两个问题: s1 指向的字符串常数, 除了空间不足以放入连接的字符串之外,  甚至都不一定可写。

4.
我认为我的编译器有问题: 我注意到sizeof('a') 是4而不是1 (即,不是sizeof(char))。

答:可能有些令人吃惊, C语言中的字符常数是int 型, 因此sizeof('a') 是sizeof(int),这是另一个与C++ 不同的地方(在c++里结果是1)。

5.
能否把 main() 定义为 void, 以避免扰人的 “main无返回值”警告?

答:不能。main() 必须声明为返回 int(经过我测试用char,long都行;但用float就不对了), 且没有参数或者接受适当类型的两个参数。
如果你调用了 exit() 但还是有警告信息, 你可能需要插入一条冗余的 return语句
(或者使用某种 “未到达”指令, 如果有的话)。很多书不负责任地在例子中使用 void main(),  
并宣称这样是正确的。但他们错了。

阅读(651) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~