Jul*_*les 1 c java arrays stack return
我注意到的一些事情:例如,在 C 中,如果您在函数中有一个本地数组
*int returnArr() {
int arr[5] = {0};
return arr;
}
Run Code Online (Sandbox Code Playgroud)
显然这不会编译。C 会告诉你你正在尝试返回一个局部变量。然而在 Java 中,同样可以做到......
int[] returnArr() {
int[] arr = new int[5];
return arr;
}
Run Code Online (Sandbox Code Playgroud)
它不会引起任何问题?为什么是这样?为什么Java可以,而C不行?
你看这两个代码片段不是真的等价的。在 Java 中,所有数组都是动态分配的(在堆上),而不是创建为“本地函数”(在堆栈上)。
与您的 Java 代码最接近的 C 代码是使用malloc()orcalloc()函数(后者用于合并您的= {0}初始化)。
因此,以下内容很好(但您必须free()在某些时候“手动”释放内存,以模拟 Java 拥有的垃圾收集器):
int *returnArr() {
int* arr = calloc(5, sizeof(int)); // "calloc" initializes to zero
return arr;
}
Run Code Online (Sandbox Code Playgroud)