访问 C 和 C# 中函数的返回值
本文关键字:函数 返回值 访问 | 更新日期: 2023-09-27 17:56:47
我对 C/C++ 和 C# 中函数返回值的可用性概念有疑问。我知道返回指向函数中创建的变量(局部变量)的指针是不正确的。在这种情况下,如果我想创建一个值数组(比如 int)并从函数返回这个数组,我该怎么做?而且,如果我直接返回一个局部变量(而不是通过指向它的指针),运行时何时回收为该变量分配的内存 - 是在返回的值分配给该值的接收器之后吗?
另一个相关的问题是在 C# 中:在 C# 中使用"new"运算符在函数中创建的变量是在堆上创建的。在函数中创建的局部变量的情况下是正确的吗?如果返回的值是按引用/地址返回的,它是否违反了上述规则(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 中。