1.注意switch中的break,否则语句会一直执行下去。
2.static:在函数内部,表示该变量的值在各个调用期间一直保持延续性
在函数这一级,表示该函数只对本文件可见
extern:用于函数定义,表示全局可见(属于冗余的)
用于变量,表示变量在其他地方定义
3.一个常见的bug
char* func()
{
char buffer[120];
...
return buffer;
}
局部变量在函数调用后即销毁了
解决方案:
1)返回一个指向字符串常量的指针
char* func()
{
return "only work for simple strings";
}
优点:简单
缺点:不能计算字符串的内容,仅使用于简单string的情况
2)使用全局声明的数组
char* func()
{
global_array[i]=...
return global_array;
}
优点:字符串可修改,简单易用
缺点:任何人都可以修改,函数的下一次调用也会覆盖该数组内容
3)使用静态数组
char* func()
{
static char buffer[120];
...
return buffer;
}
优点:可防止其他人修改这个数组
缺点:函数的下一次调用将覆盖这个数组
和全局数组一样,大型缓冲区闲置是非常浪费内存空间的
4)显式分配内存
char* func()
{
char *s=malloc(120);
...
return s;
}
优点:每次调用都会创建一个新的缓冲区,该函数以后的调用不会覆盖以前的返回值,适用于多线程代码
缺点:程序员必须承担内存管理的责任,人们容易忘记释放已分配的内存而发生内存泄漏
5)调用者分配内存
void func(char* result,int size)
{
strncpy(result,"hello lq",size);
}
buffer = malloc(size);
func(buffer,size);
...
free(buffer);
malloc和free在同一代码块进行,不易遗忘,内存管理较轻松。
阅读(694) | 评论(0) | 转发(1) |