为什么 Java 函数能够返回本地数组?

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不行?

Adr*_*ica 6

你看这两个代码片段不是真的等价的。在 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)