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 ...
随机推荐
- c++多线程在异常环境下的等待
c++11开始支持多线程编程,相关的类和函数封装在标准库头文件<thread>中,而c++多线程编程很重要的一点就是当用户创建一个std::thread对象,关联了可调用对象后,需要在该t ...
- [AirFlow]AirFlow使用指南二 DAG定义文件
1. Example """ Code that goes along with the Airflow tutorial located at: https://git ...
- keras系列︱seq2seq系列相关实现与案例(feedback、peek、attention类型)
之前在看<Semi-supervised Sequence Learning>这篇文章的时候对seq2seq半监督的方式做文本分类的方式产生了一定兴趣,于是开始简单研究了seq2seq.先 ...
- Android中开发需要的高效助推的命令总结
Android 开发中我们有时候需要借助一些命令帮助更好的高效率定位解决问题,本文就来介绍一些可能有些隐藏的而却非常好用的命令,可以帮我们快速找到问题,这些命令都是本人在开发中实践总结,个人觉得非常 ...
- iOS数组的去重,判空,删除元素,删除重复元素 model排序 等
一: 去重 有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型.今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下. 1.利用NSDiction ...
- node.js 之爬虫
1. cheerio 与 request request:模拟客户端行为,对页面进行请求 cheerio:对服务器端返回的页面进行解析: var cheerio = require('cheerio' ...
- js之广告弹出自动关闭
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 【剑指offer】10矩阵覆盖
原创博文,转载请注明出处! 0.简介 # 本文是牛客网<剑指offer>刷题笔记,笔记索引链接 1.题目 # 用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地 ...
- NOI 模拟赛
T1 Article 给 $m$ 个好串,定义一个字符串分割方案是好的当且仅当它分割出来的子串中"是好串的子串"的串长占原串串长超过 85%,定义一个好的分割方案的权值为这种分割方 ...
- three.js中点生成矩阵方法
正常情况用threejs 点生成matrix4,方法为: 例如生成饶Y轴旋转的矩阵我们要的结果为: [cos, 0, -sin, 0, 0, 1, 0, 0, sin, 0, cos, ...