这不是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;
}