zoukankan      html  css  js  c++  java
  • 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可以帮助改正一些不良习惯。 

  • 相关阅读:
    SQL单表查询
    SQL基础
    python生成器yield和send
    python模块
    python异常
    python单例设计模式
    python类方法、类属性和静态方法
    python继承
    react native window下的环境搭建和调试方案
    打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10309459.html
Copyright © 2011-2022 走看看