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

冷不防 2021-09-29 10:12 545阅读 0赞

前言

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

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

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

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

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

函数的返回值

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

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

  1. int hoge(){
  2. int a =10;
  3. return a;
  4. }
  5. int main(){
  6. int t = hoge();
  7. return 0;
  8. }
  9. //t = 10

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

  1. int * hoge(){
  2. int a[2] = {
  3. 1,2};
  4. return a;
  5. }
  6. int main(){
  7. int *t = hoge();
  8. return 0;
  9. }
  10. //我的编译器提示 [Warning] address of local variable 'a' returned [-Wreturn-local-addr] //如果想强行输出 t ,那么输出的就是乱码啦 如果没有输出乱码,只是运气好,取决于编译环境

所以,想解决第二个例子的问题,只要把a的内存申请方式,改为用malloc()函数申请就好了。

对比上面两个例子,我们可以看出,函数,可以返回一个值,如果返回一个地址,我们不一定能在这个地址中取出我们想要的值。

第一个例子中,返回的是10,第二个例子返回的是个指针。

但是由于,第二个例子中,a 所指向的那片内存在函数调用结束后被释放(储存在栈中),所以,我们无法成功的取出地址中的值。

第三个例子

1529428-20190123154254984-2062800517.png

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

第四个例子

1529428-20190123154534940-276824084.png

这个显然没有正确输出”abcdefg”,因为此处的”abcdefg”是个字符数组,储存在栈中,函数调用后,字符数组被释放,我们无法取出我们想要的内容。

PS 如果在阅读过程中发现我写的不严谨的地方,可以指出来,我会虚心接受!

另外,平日编码过程中,使用一些好的IDE可以帮助改正一些不良习惯。

转载于:https://www.cnblogs.com/woxiaosade/p/10309459.html

发表评论

表情:
评论列表 (有 0 条评论,545人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C#函数返回

    一、params.   可变参数,无论有几个参数,必须出现在参数列表的最后,可以为可变参数直接传递一个对应类型的数组。 class Program

    相关 C语言函数返回变量类型

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

    相关 C++函数返回

    首先,强调一点,和函数传参一样,函数返回时也会做一个拷贝。从某种角度上看,和传参一样,也分为三种: 返回值:返回任意类型的数据类型,会将返回数据做一个拷贝(副本)赋值给