前言数组
最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂。借此机会,从新梳理下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能够帮助改正一些不良习惯。