C语言函数返回值和变量类型

前言

  最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂。借此机会,重新梳理下C语言中函数的返回值与变量类型的关系。

按照变量的寿命,可以分为三种类型

  1.静态变量 寿命从程序开始运行,到程序关闭结束  储存在静态储存区中

  2.自动变量 寿命从声明该变量的语句块到结束为止  储存在栈中,系统自动释放

  3.通过malloc()分配的 寿命直到free()为止  储存在堆中,由用户自主释放

函数的返回值

  之前自己有写过一个关于迷宫的demo,但是总是调试出错,请教别人后发现,自己在函数中,返回了一个数组。

第一个例子,如果定义以下函数,可以成功获取到你想得到的值。

int hoge(){
    int a =10;
    return a;
}
int main(){
    int t = hoge();
    return 0;
}//t = 10

第二个例子,下面这个函数,我们想让他返回一个数组,却无法获取到我们想要的值。

int * hoge(){
    int a[2] = {1,2};
    return a;
}
int main(){
    int *t = hoge();
    return 0;
}//我的编译器提示 [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可以帮助改正一些不良习惯。 

原文地址:https://www.cnblogs.com/woxiaosade/p/10309459.html

时间: 2024-11-03 22:13:35

C语言函数返回值和变量类型的相关文章

C语言 函数返回值类型

1.返回值类型  51.有一个函数原型如下所示,则该函数的返回类型为( ) . C abc(float x,float y); A. void B. double C. int D. float 3 1 51.有一个函数原型如下所示,则该函数的返回类型为( ) . C 2 abc(float x,float y); 3 A. void         B. double         C. int         D. float C 语言函数默认返回类型为 int 29.以下函数值的类型是_

关于函数返回值为指针类型的分析

注意(原则):永远不要返回一个局部变量的指针或引用(其实是隐式的指针),可以返回局部变量本身,因为函数执行完之后,将释放分配给局部变量的存储空间,局部变量只是临时的存储空间,此时,对局部变量的引用和地址就会返回不确定的内存. 抓住这个原则,我们来看一下例子: 1.返回变量本身 //这个返回变量本身内存可以,正确 int add(int x, int y) { int sum = x + y; return sum; } int main() { int a = 3, b = 5; cout <<

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

一.java program progress of excuting:show in next picture How about the java virtual machine is it,what situation is in the jvm,or how to worke is going? If you want to slove these questions,please read the next picture: The more details please visit:

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

http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以

C语言中函数返回值的问题

c语言中有关于在函数返回值的问题,在函数中的局部变量主要是在栈上开辟的,出了函数变量就被回收了,针对函数返回值得问题,给出下面几个比较具体的例子来说明: 函数返回值是在函数中定义的局部变量 这类型的返回值在主函数中是可以使用的,因为返回局部变量值得时候,返回的是值得一个副本,而在主函数中我们需要的也只是这个值而已,因此是可以的,例如 int fun(char *arr) { int num = 0; while (*arr != '\\0') { num = num * 10 + *arr -

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

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

Linux Shell 自定义函数(定义、返回值、变量作用域)介绍

定义Shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1. 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2. 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-255). 示例(test_fun.sh): #!/bin/sh fSum 3 2; fSum() { ec

C语言的函数返回值

一:背景 谈到C语言的函数返回值,可能会感觉很亲切,不就是一个函数返回值嘛,当初学C语言的时候早就学过了很easy嘛,我曾经也是这么想的.后来要上研究生了,研究生阶段搞得就是C,所以又重新开始学习C,学习C的过程中遇到了很多问题,在此博客中一一记录.实际过程中遇到的第一个问题自然就是函数返回值了.如果有人问你在一个函数中声明一个字符串数组,最后再return这个数组.这可以实现嘛?如果是问我我可能会毫不犹豫的说OK.那事实呢?由此本文诞生了...... 二:问题 先看几个实际的例子: #incl