我怀疑C / C ++和C#中函数返回值的可用性概念。我知道返回指向函数中创建的变量的指针(局部变量)是不正确的。在这种情况下,如果我想创建一个值数组(比如int)并从函数返回这个数组我该怎么做?此外,如果我为运行时回收的此变量分配的内存,则直接返回一个局部变量(而不是通过指向它的指针) - 是否将返回的值分配给此值的接收者?
另一个相关的问题是在C#中:在C#中使用'new'运算符在函数中创建的变量是在堆上创建的。在函数中创建局部变量的情况下是真的吗?如果返回的值是引用/地址,是不是违反了上面提到的规则(C ++)?在C#中实现这一目标的方式是什么?
我的问题似乎很幼稚,但我试图更好地理解编译器和运行时的行为。如果你能为我提供这些问题的答案,那将是非常有帮助的。
谢谢, 勒凯什。
答案 0 :(得分:3)
块引用 如果我想创建一个值数组(比如int)并返回它 函数中的数组我该怎么做?
以下内容将在C#中执行此操作
public int[] Example(int size)
{
int[] numbers = new int[size];
return numbers;
}
如果我直接返回一个局部变量(不是通过指针) 它是什么时候为这个变量分配的内存被回收 runtime - 在返回的值分配给接收者之后 这个值?
如果您没有返回指针,那么您只是返回局部变量的副本。你问题的第二部分毫无意义。
另一个相关问题是在C#中:在函数中创建的变量 在堆上创建在C#中使用'new'运算符。在这种情况下是否属实? 在函数中创建的局部变量?
是的,它是在堆上创建的。
如果返回的值是引用/地址,则不是违反 上面提到的规则(C ++)?这是什么方式 在C#中实现了?
您不应该尝试将C ++与C#进行比较,因此不应该回答这个问题。除此之外......目前尚不清楚。
我的问题似乎很幼稚,但我正在努力理解 编译器和运行时的行为更好。如果,这将是非常有帮助的 你可以为我提供这些问题的答案。
所有这些问题都可以在任何C ++或C#新手程序员的书中找到。
答案 1 :(得分: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语言中。
答案 2 :(得分:0)
如果我想创建一个值数组(比如int)并从函数返回这个数组我该怎么做?
区别在于分配变量的位置。局部变量在堆栈中分配,而全局变量在堆上分配。您可以(在程序中的几乎任何位置)手动分配一些堆空间。这是我的malloc()(或类似的)或一些内部调用malloc()的更高级函数。当您使用new来创建新对象时就是这种情况。
为了在C中返回一个数组,你必须使用堆:在中以某种你喜欢的方式分配一些堆空间(malloc()或new)并返回指向它的指针(显式或通过返回对象引用)
在C#中,您将使用通用List或使用 new 构建的数组。
如果直接返回变量而不使用new(例如int的返回类型),则使用堆栈。函数完成后,该值将写入表示调用者变量的寄存器。