【问题标题】:Why are Java functions able to return local arrays?为什么 Java 函数能够返回本地数组?
【发布时间】:2021-01-26 23:57:10
【问题描述】:

我注意到了一点:例如,在 C 中,如果您在函数中有一个本地数组

*int returnArr() {
    int arr[5] = {0};
    return arr;
}

显然这不会编译。 C 会告诉你你正在尝试返回一个局部变量。然而在 Java 中,同样可以做到...

int[] returnArr() {
    int[] arr = new int[5];
    return arr;
}

它不会引起任何问题吗?为什么是这样?为什么 Java 能做到,而 C 不能?

【问题讨论】:

  • Java 有一个垃圾收集器,它只在堆栈上存储原语。其他所有内容都进入堆中。
  • @khelwood C++ 有一个 new 运算符,但 C 没有!
  • “显然这不会编译”——但它确实编译(除了函数返回类型中的拼写错误)。
  • @KonradRudolph 会导致分段错误
  • @Jules 如果幸运的话,是的。但它在 runtime 时这样做。

标签: java arrays c return stack


【解决方案1】:

您显示的两个代码 sn-ps 并不真正等效。在 Java 中,all arrays are dynamically allocated (on the heap),而不是被创建为“本地函数”(在堆栈上)。

与您的 Java 代码最接近的 C 代码将使用 malloc()calloc() 函数(后者用于合并您的 = {0} 初始化)。

因此,以下内容会很好(但您必须在某些时候使用 free() '手动' 释放内存,以模拟 Java 具有的垃圾收集器):

int *returnArr() {
    int* arr = calloc(5, sizeof(int)); // "calloc" initializes to zero
    return arr;
}

【讨论】:

  • 哦,我不知道 Java 中的所有数组都存储在堆上。我假设一个 int[] 数组只会存储在堆栈中,就像在 C 中的语法一样。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2013-05-16
  • 2017-06-16
  • 2019-01-08
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多