c语言函数中定义的数组如何返回
c语言中想要在函数中返回数组其底层实质就是返回一个指针。例如
int* fun() {
int arr[3];
arr[0] = 0;
arr[1] = 1;
arr[2] = 3;
return arr;
}
int main() {
int* p = fun();
for (int i = 0; i < 3; i++) {
printf("%d ", p[i]);
}
return 0;
}
这样的写法是错误的,arr是在fun函数中定义的它随着fun生命周期结束它也就随之销毁,它返回的是一个指针,但它里面的内容已经被销毁。
解决这种问题又三种方法
return 0;
}
这样的写法是错误的,arr是在fun函数中定义的它随着fun生命周期结束它也就随之销毁,它返回的是一个指针,但它里面的内容已经被销毁。
解决这种问题又三种方法
语法说明
标题文本样式列表图片链接目录代码片表格注脚注释自定义列表LaTeX 数学公式插入甘特图插入UML图插入Mermaid流程图插入Flowchart流程图插入类图快捷键
标题复制
方法一:malloc函数申请堆空间
在函数中用malloc函数给arr数组在堆中申请内存,使fun函数返回的是arr在堆中的地址。虽然fun函数生命周期结束(它的变量什么的都是在栈中,函数结束栈被销毁),但arr已经通过malloc在堆中申请内存,函数结束不会对堆产生影响。但需要注意的是,在使用指针结束后,需释放它在堆中申请的内存空间,否则会造成内存泄漏。
int* fun() {
int *arr;
arr = (int*)malloc(sizeof(int) * 3);
arr[0] = 77;
arr[1] = 88;
arr[2] = 99;
return arr;
}
需要注意的是在fun函数中定义的是arr指针而不是arr数组。
方法二:satatic关键字
静态全局变量:在全局变量前加上关键字static,该变量就被定义成一个静态全局变量。
静态局部变量:在局部变量(一般为函数体内定义的变量)前加上static关键字,它就成为静态局部变量。
在该示例中我们用到的是静态局部变量,通常,在函数体内定义一个变量。程序运行到此处系统会为该局部变量分配栈内存。随着该函数结束,系统会销毁函数中所定义的变量。但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。