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");
6.运算符优先级
7.C语言的“大嘴法”原则,通俗的说,表示表达式会尽可能包含更多的操作符(正确的前提下)
如:z = y+++x;
解析为:z = y++ + x;
8.当函数或代码块退出时,他们所占用的内存空间将被释放,因此,切忌返回值是指向局部变量的指针的情况
因为局部变量在函数退出时,所占的空间被释放,这时返回的指针,这也不知道这个指针指向哪里?
这种指针被称为“野指针”。
9.“野指针”的解决方案
char * func() { return "Hello"; }
char * func() { static char buf[20]; return buf; }
char * func() { char * s = malloc(100); return s; }