-1

我对 C/C++ 和 C# 中函数的返回值可用性的概念有疑问。我知道返回指向函数中创建的变量(局部变量)的指针是不正确的。在这种情况下,如果我想创建一个值数组(比如 int)并从函数返回这个数组,我该怎么做?而且,如果我直接返回一个局部变量(而不是通过指向它的指针),运行时何时回收为该变量分配的内存 - 是在返回的值分配给该值的接收者之后吗?

另一个相关问题是在 C# 中:在 C# 中使用“new”运算符在函数中创建的变量是在堆上创建的。在函数中创建局部变量的情况下是真的吗?如果返回的值是引用/地址,是不是违反了上面提到的规则(C++)?在 C# 中实现这一点的方式是什么?

我的问题可能看起来很幼稚,但我试图更好地理解编译器和运行时的行为。如果您能为我提供这些问题的答案,那将是非常有帮助的。

谢谢,拉克什。

4

3 回答 3

3

如果我想创建一个值数组(比如 int)并从函数返回这个数组,请使用 Blockquote 我该怎么做?

以下将在 C# 中执行此操作

public int[] Example(int size)
{

     int[] numbers = new int[size]; 
     return numbers;    

}

而且,如果我直接返回一个局部变量(而不是通过指向它的指针),运行时何时回收为该变量分配的内存 - 是在返回的值分配给该值的接收者之后吗?

如果您没有返回指针,那么您只是返回了局部变量的副本。你问题的第二部分没有意义。

另一个相关问题是在 C# 中:在 C# 中使用“new”运算符在函数中创建的变量是在堆上创建的。在函数中创建局部变量的情况下是真的吗?

是的,它是在堆上创建的。

如果返回的值是引用/地址,是不是违反了上面提到的规则(C++)?在 C# 中实现这一点的方式是什么?

您不应该尝试将 C++ 与 C# 进行比较,因此不应回答此问题。此外......正在实现什么也不清楚。

我的问题可能看起来很幼稚,但我试图更好地理解编译器和运行时的行为。如果您能为我提供这些问题的答案,那将是非常有帮助的。

所有这些问题都在任何 C++ 或 C# 新手程序员的书中得到解决。

于 2013-01-31T16:38:00.253 回答
0

我不确定你的问题是什么,但要返回一个整数数组,你需要为它分配不能被程序覆盖的内存,然后返回一个指向数组的指针,而不是数组本身:

int main(void)
{
    int *i; //integer pointer
    i = return_a_two_integer_array(); //i now points to the location in memory of the return value of return_a_two_integer_array();
    free(i); //the memory is no longer allocated and can be overwritten
}

int *return_a_two_integer_array
{
    int *two_integer_array;
    if(!(two_integer_array = malloc(sizeof(int)*2))) //allocate the memory
    {
        return 0x00; //memory allocation failed
    }
    two_integer_array[0] = 1;
    two_integer_array[1] = 2;
    return two_integer_array; //return the pointer 
}

顺便说一句,这是在 C 中。

于 2013-01-31T16:36:35.597 回答
0

如果我想创建一个值数组(比如 int)并从函数中返回这个数组,我该怎么做?

不同之处在于分配变量的位置。局部变量在堆栈中分配,而全局变量在堆中分配。您可以(在程序中的几乎任何地方)手动分配一些堆空间。这是由我的 malloc() (或类似的)或在内部调用 malloc() 的一些更高级别的函数完成的。当您使用 new 创建新对象时就是这种情况。

为了在 C 中返回一个数组,您必须使用堆:以某种方式分配一些堆空间(malloc() 或 new)并返回指向它的指针(显式或通过返回对象引用)

在 C# 中,您将使用通用 List 或使用new构造的数组。

如果您不使用 new 直接返回一个变量(例如返回类型为 int),则使用堆栈。当函数完成时,该值被写入代表调用者变量的寄存器。

于 2013-01-31T16:39:19.127 回答