C语言中函数返回值不一致问题

 更新时间:2023年02月24日 09:42:13   作者:雪.痕  
这篇文章主要介绍了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("\n");
	for(i=0;i<5;i++){
		printf(" a[%d] = %d ; &a = %p;\n",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\n",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;\n",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\n",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返回值类型要与函数本身定义时候的返回值类型一致,即使不一致也是可以相互转化的,最终以函数定义时候的返回值类型为主进行转化,若转化不了则编译期间就报错了;

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C/C++内存管理详情

    C/C++内存管理详情

    这篇文章主要通过描述了C/C++内存分布、C/C++的一些函数理方面来展开C/C++内存管理的内容,需要的朋友请参考下文
    2021-08-08
  • C++中String类常见题目分享

    C++中String类常见题目分享

    这篇文章主要为大家详细介绍了一些C++中String类的常见题目,文中的示例代码讲解详细,对我们掌握C++有一定的帮助,感兴趣的小伙伴可以了解一下
    2023-06-06
  • C++实现简易贪吃蛇游戏

    C++实现简易贪吃蛇游戏

    这篇文章主要为大家详细介绍了C++实现简易贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C语言二维数组中的查找的实例

    C语言二维数组中的查找的实例

    这篇文章主要介绍了C语言二维数组中的查找的实例的相关资料,需要的朋友可以参考下
    2017-07-07
  • C语言入门之浮点数

    C语言入门之浮点数

    这篇文章主要为大家介绍了C语言的浮点数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C语言实现贪吃蛇游戏(单人版)

    C语言实现贪吃蛇游戏(单人版)

    这篇文章主要为大家详细介绍了C语言实现贪吃蛇游戏单人版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • c++11中regex正则表达式示例简述

    c++11中regex正则表达式示例简述

    这篇文章主要给大家介绍了关于c++11中regex正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++11具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 如何把C++的源代码改写成C代码的方法

    如何把C++的源代码改写成C代码的方法

    这篇文章主要介绍了如何把C++的源代码改写成C代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • C++代码实现贪吃蛇小游戏

    C++代码实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C++贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C语言实现页面置换 先进先出算法(FIFO)

    C语言实现页面置换 先进先出算法(FIFO)

    这篇文章主要为大家详细介绍了C语言实现页面置换,先进先出算法(FIFO),文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12

最新评论