C语言中函数返回值不一致问题如何解决

寻技术 C/C++编程 2023年07月12日 105

本文小编为大家详细介绍“C语言中函数返回值不一致问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中函数返回值不一致问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    C语言函数返回值不一致

    在运行成程序上有时会发现函数内部的值与返回到主函数的值会相差很多出现随机值,但是它们的地址却相同!**一般的原因多是内存污染,多发于函数返回数组地址**或返回主函数后直接应用。

    例如下面的两个程序,不用关心它做了什么,只需观察它们的不同点(已注释)

    #include <stdio.h>
    #include <ctype.h>
    int *count_e(char *str);
    int main(){
    	char str[] = {"abc,cba,def"};
    	int *a,i;
    	a = count_e(str);
    	puts("
    ");
    	for(i=0;i<5;i++){
    		printf(" a[%d] = %d ; &a = %p;
    ",i,a[i],&a[i]);
    	}
    	free(a);
    	return 0; 
    } 
    
    int *count_e(char *str){
    	if(str == NULL)
    		return NULL;
    	int ls[5] = {0};       //关键!!!内存污染问题! 
    	int i,k,t;
    	i = k = t = 0;
    	while(isspace(str[i]))
    		i++;                
    	while(str[i]){
    		if(isupper(str[i])){
    			ls[1]++;k=1;
    		}else if(islower(str[i])){
    			ls[2]++;k=1;
    		}else if(isdigit(str[i])){
    			ls[4]++;k=1;
    		}else if(isspace(str[i])){
    			t = 1;
    		}else{
    			ls[3]++;t=1;
    		} 
    		if(k==1 && t ==1){
    			ls[0]++;
    			k = t = 0;
    		}
    		i++;
    	} 
    	for(t=0;t<5;t++)
    		printf("ls[%d] = %d ; &ls[i] = %p
    ",t,ls[t],&ls[t]);
    	if(! isspace(str[--i]))
    		ls[0]++;
    	return ls;
    }

    运行如下:

    ls[0] = 2 ; &ls[i] = 000000000062FDB0
    ls[1] = 0 ; &ls[i] = 000000000062FDB4
    ls[2] = 9 ; &ls[i] = 000000000062FDB8
    ls[3] = 2 ; &ls[i] = 000000000062FDBC
    ls[4] = 0 ; &ls[i] = 000000000062FDC0 // !!!

    a[0] = 239139376 ; &a = 000000000062FDB0;
    a[1] = 32760 ; &a = 000000000062FDB4;
    a[2] = 1 ; &a = 000000000062FDB8;
    a[3] = 0 ; &a = 000000000062FDBC;
    a[4] = 11146080 ; &a = 000000000062FDC0; // !!!注意

    ------------------------------------分割线-----------------------------------------

    #include <stdio.h>
    #include <ctype.h>
    int *count_e(char *str);
    int main(){
    	char str[] = {"abc,cba,def"};
    	int *a,i;
    	a = count_e(str);
    	for(i=0;i<5;i++){
    		printf(" a[%d] = %d ; &a = %p;
    ",i,a[i],&a[i]);
    	}
    	free(a);
    	return 0; 
    } 
    
    int *count_e(char *str){
    	if(str == NULL)
    		return NULL;
    	int *ls = (int *)calloc(5,sizeof(int)); //ls[5] = {0}; !!!注意不同!!!内存污染问题!** 
    	int i,k,t;
    	i = k = t = 0;
    	while(isspace(str[i]))
    		i++;                
    	while(str[i]){
    		if(isupper(str[i])){
    			ls[1]++;k=1;
    		}else if(islower(str[i])){
    			ls[2]++;k=1;
    		}else if(isdigit(str[i])){
    			ls[4]++;k=1;
    		}else if(isspace(str[i])){
    			t = 1;
    		}else{
    			ls[3]++;t=1;
    		} 
    		if(k==1 && t ==1){
    			ls[0]++;
    			k = t = 0;
    		}
    		i++;
    	} 
    	for(t=0;t<5;t++)
    		printf("ls[%d] = %d ; &ls[i] = %p
    ",t,ls[t],&ls[t]);
    	if(! isspace(str[--i]))
    		ls[0]++;
    	return ls;
    }

    运行如下:

    ls[0] = 2 ; &ls[i] = 00000000001D1430
    ls[1] = 0 ; &ls[i] = 00000000001D1434
    ls[2] = 9 ; &ls[i] = 00000000001D1438
    ls[3] = 2 ; &ls[i] = 00000000001D143C
    ls[4] = 0 ; &ls[i] = 00000000001D1440 //!!!!

    a[0] = 3 ; &a = 00000000001D1430;
    a[1] = 0 ; &a = 00000000001D1434;
    a[2] = 9 ; &a = 00000000001D1438;
    a[3] = 2 ; &a = 00000000001D143C;
    a[4] = 0 ; &a = 00000000001D1440; // !!!!

    此示例运用了分配内存的方法cmalloc()函数来替代直接创建的数组。

    函数的返回值注意事项

    函数的返回值

    一般情况下,通过函数的调用,使调用函数可以获得被调用函数的函数值,这个值就叫做返回值。

    注意事项

    ①、有的函数有返回值,有的函数没有返回值,具体看函数的声明类型,如果返回值类型为 void 则为无返回值类型;

    ②、函数的返回值是通过函数中的 return 语句获得的。一个函数中可以有一个以上的return语句,执行到哪个return就从哪个return返回了,return语句执行完之后,他之后的代码不会被执行;

    ③、函数内部的return返回值类型要与函数本身定义时候的返回值类型一致,即使不一致也是可以相互转化的,最终以函数定义时候的返回值类型为主进行转化,若转化不了则编译期间就报错了;

    ④、原则上一个函数只能有一个返回值,若要返回多个值则可以通过参数返回或者返回结构类型等等。

    关闭

    用微信“扫一扫”