读《C专家编程》总结(二)

这不是BUG,而是语言特性

1.malloc使用注意:

malloc(strlen(str))   ——错误;

malloc(strlen(str) + 1) ——正确;

因为字符串以'\0' 结尾,strlen函数只计算字符串的有效字符个数;


2.break语句跳出的最近一层循环

	int i=2;
	static int j =0;
	int a[10];
	while(i>0)
	{
		while(j<10)
		{
			if( j == 5 )
			{
				j++;
				break;//跳出的是for循环,不是while循环;
			}
			a[j] = j;
			j++;
		}
		i--;
	}
	for(i=0; i<10; i++)
	{
		printf("%d\n",a[i]);//结果应该是a[5]里是垃圾值,其余的都被复制
	}


3.switch语句下每个case分支不要忘了break;case语句后不加break,程序就会依次执行下去。


4.ANSI新特性,相邻的字符串常量会被自动合并成一个字符串

printf("A favourite children's book"
            "is XXXXXXXXXXXXXXXX");
旧风格:

printf("A favourite children's book \
           is XXXXXXXXXXXX");

5.extern 修饰函数时,代表函数是全局可见的,加不加效果一样,所以这一特性是冗余的;


6.运算符优先级



7.C语言的“大嘴法”原则,通俗的说,表示表达式会尽可能包含更多的操作符(正确的前提下)

如:z = y+++x;

解析为:z = y++ + x;


8.当函数或代码块退出时,他们所占用的内存空间将被释放,因此,切忌返回值是指向局部变量的指针的情况

因为局部变量在函数退出时,所占的空间被释放,这时返回的指针,这也不知道这个指针指向哪里?

这种指针被称为“野指针”。


9.“野指针”的解决方案

  • 返回指向字符串常量的指针;
char * func()
{
        return "Hello";
}
  • 使用全局声明的数组
  • 使用静态数组
char * func()
{
        static char buf[20];
        return buf;
}

  • 显式分配一些内存(malloc),返回保存值
char * func()
{
        char * s = malloc(100);
        return s;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值