C语言特性BUG

1.  关键字const并不能把变量变成常量,在一个符号前加上const限定符只是表明这个符号不能被赋值。也就是说它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部的方法来修饰这个值。const最有用之处就是用它来限定函数的形参。这样该函数将不会修改指针所指的数据。const和*的组合通常只用于在数组形式的参数中模拟传值调用。它声称“我给你一个指向它的指针,但你不能修改它”

2.  当执行算术运算时,操作数的类型如果不同,就会发生转换,数据类型一般朝着浮点精度更高,长度更长的方向转换,整数如果转换为signed不会丢失信息,就转换为signed,否则转换为unsigned。

3.  在C语言中,无论什么时候,如果遇见了这样一条语句malloc(strlen(str));几乎可以断定它是错误的,而malloc(strlen(str) + 1)才是正确的。

4.  分析编程语言缺陷的一种方法就是把所有的缺陷归于3类:不该做的做了,该做的没有做,该做但做得不合适。

5.  一个‘L’的NUL用于结束一个ACSII字符串;两个‘L’的NULL用于表示什么也不指向(空指针)。

6.  定义C函数时,在缺省情况下函数的名字是全局可见的,可以在函数的名字前面加个冗余的extern关键字,也可以不加,效果一样,这个函数对于链接到它的目标文件的任何东西都是可见的。如果想限制对这个函数的访问,就必须加上static关键字。

7.  void 作为函数的返回类型,表示不返回任何值,在指针声明中表示通用指针类型,位于参数列表中表示没有参数。

8.  ()在函数定义中包围形式参数表;调用一个函数;改变表达式的运算次序;将值转换为其他类型(强制类型转换);定义带参数的宏;包围sizeof操作符的操作数。

9.  逗号运算符在所有运算符中优先级最低。例如下面这个例子:

    i = 1,2;

   i的最终结果将是什么?对,我们知道逗号运算符的值就是右边操作数的值,但在这里,赋值运算符的优先级更高,所以实际情况应该是:

(i= 1),2;

i赋值为1,接着执行常量2的运算,计算结果丢弃,最终,i的结果是1而不是2.

10.  对于下面这种赋值运算:

int a, b = 1, c = 2;

a = b = c;

所有的赋值符都具有右集合性,就是说表达式中最右边的操作最先执行,然后从右边到左依次执行。这样,c先赋值给b,,然后b再赋值给a,最终a的值是2。

11.   “\”字符可用于对一些字符进行“转义”,包括newline。被转义的newline在逻辑上把下一行当做当前的延续,它可用于连接长字符串。如果在“\”和回车键之间不小心留上一两个空格就会出现问题,“\  ”与“\”就不一样的。

12.  对于局部变量的返回引用问题:

char * localized_time(char * filenamr)

{

struct tm *tm_ptr;

struct stat stat_block;

char buffer[120];

stat(filename,&stat_block);

tm_ptr = localtime(&stat_block,st_mtime);

strftime(buffer, sizeof(buffer),"%a  %b  %e  %T  %Y", tm_ptr);

return buffer;

}

由于buffer是一个自动分配内存的数组,是该函数的局部变量。当控制流离开声明自动变量(局部变量)的范围时,自动变量变自动失效,这就意味着即使返回一个指向局部变量的指针,由于该变量已经被销毁,谁也不知道这个指针所指向的地址的内容是什么。

解决思路:

1.返回一个指向字符串常量的指针;2. 使用全局声明的数组;3. 使用静态数组static声明; 4. 显示分配一些内存malloc函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值