目录
问题来源:
大家都知道:
do语句:
do语句先执行后判断,循环体至少执行一次
for/while语句先判断后执行
在平常的使用中我们也一般只用for/while循环,do语句鲜有用到,那么是否do while语句真的完全可以用for/while代替,毫无用处那?
代码分析
我们来看一段代码code:
int func(int n)
{
int i = 0;
int ret = 0;
int* p = (int*)malloc(sizeof(int) * n); //分配资源
do
{
if(NULL == p) break;
if(n < 0) break;
for(i=0; i<n; i++)
{
p[i] = i;
printf("%d\n", p[i]);
}
ret = 1;
}while(0);
free(p); //释放资源
return ret;
}
这段代码理解很简单,就是给一片动态申请的内存赋值,如果没有申请成功则返回,如果n<0也返回。
我们平常写这段代码会怎么写哪?没有对比就没有伤害吗,哈哈。我们一般会像这样写:
int func_compare(int n)
{
int i = 0;
int ret = 0;
int* p = (int*)malloc(sizeof(int) * n); //分配资源
if(NULL == p)
{
free(p); //释放资源(第1次)
return 0;
}
if(n < 0)
{
free(p); //释放资源(第2次)
return 0;
}
for(i=0; i<n; i++)
{
p[i] = i;
printf("%d\n", p[i]);
}
free(p); //释放资源(第3次)
return 1;
}
可以看到在第二种写法中我们free了3次,如果不free就会造成内存泄漏;
而在第一种方法中我们只free了一次,这样内存就统一分配、统一释放;
很显然第一种方法更好,在这里我们就巧妙的使用了一个do...while(0)解决了这个问题!!!