C语言函数返回值和变量类型
前言
最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂。借此机会,重新梳理下C语言中函数的返回值与变量类型的关系。
按照变量的寿命,可以分为三种类型
1.静态变量 寿命从程序开始运行,到程序关闭结束 储存在静态储存区中
2.自动变量 寿命从声明该变量的语句块到结束为止 储存在栈中,系统自动释放
3.通过malloc()分配的 寿命直到free()为止 储存在堆中,由用户自主释放
函数的返回值
之前自己有写过一个关于迷宫的demo,但是总是调试出错,请教别人后发现,自己在函数中,返回了一个数组。
第一个例子,如果定义以下函数,可以成功获取到你想得到的值。
int hoge(){
int a =;
return a;
}
int main(){
int t = hoge();
return ;
}
//t = 10
第二个例子,下面这个函数,我们想让他返回一个数组,却无法获取到我们想要的值。
int * hoge(){
int a[] = {,};
return a;
}
int main(){
int *t = hoge();
return ;
}
//我的编译器提示 [Warning] address of local variable 'a' returned [-Wreturn-local-addr]
//如果想强行输出 t ,那么输出的就是乱码啦 如果没有输出乱码,只是运气好,取决于编译环境
所以,想解决第二个例子的问题,只要把a的内存申请方式,改为用malloc()函数申请就好了。
对比上面两个例子,我们可以看出,函数,可以返回一个值,如果返回一个地址,我们不一定能在这个地址中取出我们想要的值。
第一个例子中,返回的是10,第二个例子返回的是个指针。
但是由于,第二个例子中,a 所指向的那片内存在函数调用结束后被释放(储存在栈中),所以,我们无法成功的取出地址中的值。
第三个例子

上面的代码在vs2017报错,但是在DEV C中可以运行,且tt 的值为 "abcdefg",因为此处的"abcdefg"是字符串常量,储存在静态储存区,而不是栈中,在函数调用结束之后,也可以在返回的地址下,取出我们想要的字符串。
第四个例子

这个显然没有正确输出"abcdefg",因为此处的"abcdefg"是个字符数组,储存在栈中,函数调用后,字符数组被释放,我们无法取出我们想要的内容。
PS 如果在阅读过程中发现我写的不严谨的地方,可以指出来,我会虚心接受!
另外,平日编码过程中,使用一些好的IDE可以帮助改正一些不良习惯。
C语言函数返回值和变量类型的更多相关文章
- C语言中malloc函数返回值是否需要类型强制转换问题
1. 在C语言中, 如果调用的函数没有函数原型, 则其返回值将默认为 int 型. 考虑调用malloc函数时忘记了 #include <stdlib.h>的情况 此时malloc函数返回 ...
- java方法返回值的变量类型困惑
一.java program progress of excuting:show in next picture How about the java virtual machine i ...
- C++函数返回值发生的对象复制
最近用QT做一个监控系统的项目,需要显示目标的运动轨迹,每次目标移动后,就在目标的轨迹中(用vector记录)添加一条新轨迹. 但是在运行中画面里一直不出现轨迹,经过调试发现是记录轨迹的函数出错了. ...
- go语言 函数return值的几种情况
分三种情况 (以下 “指定返回值”这句话, 仅指return后面直接跟着的返回值) 退出执行,不指定返回值 (1) 函数没有返回值 package main import ( "fmt&qu ...
- c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)
C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...
- linux shell自定义函数(定义、返回值、变量作用域)介绍
http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- linux shell 自定义函数(定义、返回值、变量作用域)介绍
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...
- 转 linux shell自定义函数(定义、返回值、变量作用域)介绍
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...
随机推荐
- Hibernate入门1. Hibernate基础知识入门
Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...
- MVC DateTime 字段 EditTime 必须是日期模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式
ASP.NET MVC 中model含有DateTime类型的字段 更新字段时提示:字段 EditTime必须是日期,. 但是明明填入的是日期还是给出这个提示, 看有的博客说那是因为日期形式错了,如果 ...
- mysqldump 使用方法
1.仅导出数据: mysqldump -t -uroot -proot pgenius RES_COM_PFT_FCST>RES_COM_PFT_FCST.sql 2.有条的导出数据: mysq ...
- linux:系统启动流程
系统启动流程 本文基于CentOS6 版本 黑色部分为主流程分支,蓝色部分为详细流程分支,绿色部分是注释部分 第一步--加载BIOS打开计算机电源,计算机会首先加载BIOS信息,主要负责检测系统外围关 ...
- win10 安装MongoDB
win10上面安装mongodb的时候,注意不要勾选上Install MongoDB Compass, 否则会退出报错!!!! mongodb的安装 我是在E盘建立的一个mongodb文件夹,用来安装 ...
- Kotlin Reference (一) Basic Syntax
什么是Kotlin Kotlin翻译成中文叫"靠他灵",它是由JetBrains公司发明的一种基于JVM的编程语言,目前Google宣布kotlin为Android开发的官方语言. ...
- Deep Reinforcement Learning 基础知识(DQN方面)
Introduction 深度增强学习Deep Reinforcement Learning是将深度学习与增强学习结合起来从而实现从Perception感知到Action动作的端对端学习的一种全新的算 ...
- memcached asp.net
下载文件 memcached 1.解压缩文件到e:\memcached 2.命令行输入 e:\memcached\memcached.exe -d install' 3.命令行输入 e:\memcac ...
- SAP NetWeaver Business Client (NWBC) 简介
1.NWBC 简介 SAP NetWeaver Business Client (NWBC) 是新一代SAP用户界面,集成了SAPGUI事务和新的web dynpro应用,类似于桌面应用程序. SAP ...
- python爬虫入门(5)-Scrapy概述
http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框 ...