do while妙用:

目录

 

问题来源:

代码分析

结束


问题来源:

大家都知道:

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)解决了这个问题!!!

结束

猜你喜欢

转载自blog.csdn.net/QQ1402369668/article/details/82967157
今日推荐