我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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返回值类型要与函数本身定义时候的返回值类型一致,即使不一致也是可以相互转化的,最终以函数定义时候的返回值类型为主进行转化,若转化不了则编译期间就报错了;

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍了C语言中函数返回值不一致问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-24

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

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

C#函数out多个返回值问题

这篇文章主要介绍了C#函数out多个返回值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-24

C语言函数怎么返回多个值

这篇文章主要介绍“C语言函数怎么返回多个值”,在日常操作中,相信很多人在C语言函数怎么返回多个值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言函数怎么返回多个值”的疑惑有所帮助!接下来,请跟着小编一起来
2023-07-05

C语言函数多个返回值方式

这篇文章主要介绍了C语言函数多个返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-24

Shell中函数返回值超出问题

1、前言快半年没有写博客了,荒废了很久,工作中的杂事太多,自己越来越懒了。为了鞭策自己成长,还是要坚持写写博客,记录自己的成长。 2、shell函数介绍 语法:[ function ] funname [()]{action;[return
2022-06-04

C语言中返回值指针函数的示例分析

这篇文章主要为大家展示了“C语言中返回值指针函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中返回值指针函数的示例分析”这篇文章吧。 #includevo
2023-06-29

如何调试 C++ 函数返回值相关的问题

调试 c++++ 函数返回值问题的关键技巧:检查函数头:确保返回类型正确,签名与实现匹配。使用调试器:跟踪函数调用、检查参数和返回值,验证数据结构状态。添加日志语句:跟踪函数执行,识别返回值问题,记录参数、中间结果和返回值。使用单元测试:自
如何调试 C++ 函数返回值相关的问题
2024-04-13

C#函数out多个返回值问题怎么解决

今天小编给大家分享一下C#函数out多个返回值问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C#函数返回多个参数
2023-07-05

C语言中getchar函数详解看这一篇就够了(函数功能、使用、返回值)

getchar读取字符的函数,今天通过本文给大家介绍C语言中getchar函数简介用法示例详解,感兴趣的朋友跟随小编一起看看吧
2023-02-28

C语言中怎么通过指针参数返回值

今天小编给大家分享一下C语言中怎么通过指针参数返回值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简单的案例深夜无聊而引发的
2023-07-05

C语言中如何通过指针参数返回值

这篇文章主要介绍了C语言中如何通过指针参数返回值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录