前言

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

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

静态储存区中

栈中,系统自动释放

堆中,由用户自主释放

函数的返回值

函数中,返回了一个数组。

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

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 所指向的那片内存在函数调用结束后被释放(储存在栈中),所以,我们无法成功的取出地址中的值。

第三个例子

c查看java lunx c查看返回值类型_c查看java lunx

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

第四个例子

c查看java lunx c查看返回值类型_c查看java lunx_02

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