前言

  最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂。借此机会,重新梳理下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语言函数返回值和变量类型的更多相关文章

  1. C语言中malloc函数返回值是否需要类型强制转换问题

    1. 在C语言中, 如果调用的函数没有函数原型, 则其返回值将默认为 int 型. 考虑调用malloc函数时忘记了 #include <stdlib.h>的情况 此时malloc函数返回 ...

  2. java方法返回值的变量类型困惑

    一.java program progress of excuting:show in next picture        How about the java virtual machine i ...

  3. C++函数返回值发生的对象复制

    最近用QT做一个监控系统的项目,需要显示目标的运动轨迹,每次目标移动后,就在目标的轨迹中(用vector记录)添加一条新轨迹. 但是在运行中画面里一直不出现轨迹,经过调试发现是记录轨迹的函数出错了. ...

  4. go语言 函数return值的几种情况

    分三种情况 (以下 “指定返回值”这句话, 仅指return后面直接跟着的返回值) 退出执行,不指定返回值 (1) 函数没有返回值 package main import ( "fmt&qu ...

  5. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  6. linux shell自定义函数(定义、返回值、变量作用域)介绍

    http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...

  7. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  8. linux shell 自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  9. 转 linux shell自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

随机推荐

  1. 1: 介绍Prism5.0 Introduction to the Prism Library 5.0 for WPF(英汉对照版)

     Prism provides guidance designed to help you more easily design and build rich, flexible, and easy- ...

  2. python爬虫之requests模块

    一. 登录事例 a. 查找汽车之家新闻 标题 链接 图片写入本地 import requests from bs4 import BeautifulSoup import uuid response ...

  3. APUE学习笔记——5缓冲Buffering、流、文件对象

    缓冲的几个基本概念     缓冲的作用:减少系统read和write的次数. 全缓冲         系统标准I/O缓冲区被写满时才进行真正的I/O操作.         磁盘文件一般使用全缓冲   ...

  4. PostgreSQL备份工具-pg_backrest(转)

    转自:http://blog.chinaunix.net/uid-7270462-id-5777877.html 官网:https://pgbackrest.org 一.配置集中备份服务器 1.1 备 ...

  5. 解决在django中应用keras模型时出现的ValueError("Tensor %s is not an element of this graph." % obj)问题

    用keras训练好模型,再在django初始化加载模型,这个过程没有问题,但是在调用到模型执行model.predict()的时候就报错: raise ValueError("Tensor ...

  6. python基础第一章

    Python基础 第一个python程序 变量 程序交互 基本数据类型 格式化输出 基本运算符 流程控制if...else... 流程控制-循环 第一个python程序 文件执行 1.用notepad ...

  7. Scala函数式编程——近半年的痛并快乐着

    从9月初啃完那本让人痛不欲生却又欲罢不能的<七周七并发模型>,我差不多销声匿迹了整整4个月.这几个月里,除了忙着讨食,便是继续啃另一本"锯著"--<Scala函数 ...

  8. C++语言的url encode 和decode

    std::string UrlEncode(const std::string& szToEncode) { std::string src = szToEncode; char hex[] ...

  9. [转载][QT][SQL]sq]学习记录1_模糊搜索

    转载自:sql学习网站: http://www.w3school.com.cn/sql/index.asp 用于模糊搜索数据库的数据 语句:http://www.w3school.com.cn/sql ...

  10. CentOS跨网段访问

    centos6.2_64删除虚拟网卡 virbr0 卸载以下组件,然后重启系统 yum remove libvirt yum remove libvirt-python 来源:http://www.i ...