Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229520
  • 博文数量: 108
  • 博客积分: 3092
  • 博客等级: 中校
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 16:35
文章分类

全部博文(108)

文章存档

2011年(3)

2010年(43)

2009年(19)

2008年(43)

我的朋友

分类: C/C++

2009-04-18 11:06:23

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在同一代码块进行,不易遗忘,内存管理较轻松。
 
 
阅读(662) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~