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

前言数组

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

按照变量的寿命,能够分为三种类型编码

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

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

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

函数的返回值code

  以前本身有写过一个关于迷宫的demo,可是老是调试出错,请教别人后发现,本身在函数中,返回了一个数组blog

第一个例子,若是定义如下函数,能够成功获取到你想获得的值。内存

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能够帮助改正一些不良习惯。 

相关文章
相关标签/搜索