访问 C 和 C# 中函数的返回值

本文关键字:函数 返回值 访问 | 更新日期: 2023-09-27 17:56:47

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

另一个相关的问题是在 C# 中:在 C# 中使用"new"运算符在函数中创建的变量是在堆上创建的。在函数中创建的局部变量的情况下是正确的吗?如果返回的值是按引用/地址返回的,它是否违反了上述规则(C++)?在 C# 中实现此目的的方式是什么?

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

谢谢拉克什。

访问 C 和 C# 中函数的返回值

块引用 如果我想创建一个值数组(比如 int)并返回这个 函数中的数组如何执行此操作?

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

public int[] Example(int size)
{
     int[] numbers = new int[size]; 
     return numbers;    
}

而且如果我直接返回局部变量(而不是通过指针) 到它)何时为这个变量分配的内存被回收 运行时 - 是否在返回的值分配给接收器之后 这个值?

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

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

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

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

您不应该尝试将C++与 C# 进行比较,因此不应回答此问题。 此外。。。正在取得的成就也不清楚。

我的问题可能看起来很幼稚,但我试图理解 编译器和运行时的行为更好。如果 你可以为我提供这些问题的答案。

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

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

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

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

在 C# 中,您将使用泛型列表或数组,两者都使用 new 构造。

如果您直接返回变量而不使用 new(例如返回类型 int),则使用堆栈。函数完成后,该值将写入表示调用方变量的寄存器。

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

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 中。