-1

C/C++ および C# の関数からの戻り値の可用性の概念について疑問があります。関数内で作成された変数(ローカル変数)へのポインタを返すのは正しくないことはわかっています。この場合、値の配列 (int など) を作成し、関数からこの配列を返したい場合、どうすればよいでしょうか? また、ローカル変数を直接 (ポインターを介してではなく) 返す場合、この変数に割り当てられたメモリがランタイムによって再利用されるのはいつですか? 返された値がこの値の受信者に割り当てられた後ですか?

関連するもう 1 つの質問は C# にあります。C# で「new」演算子を使用して関数で作成された変数は、ヒープ上に作成されます。関数で作成されたローカル変数の場合は本当ですか? 返される値が参照/アドレスによるものである場合、上記のルール(C++)に違反していませんか? これを C# で実現する方法は何ですか?

私の質問は素朴に思えるかもしれませんが、コンパイラとランタイムの動作をよりよく理解しようとしています。これらの質問に対する答えを教えていただければ大変助かります。

ありがとう、ラケシュ。

4

3 に答える 3

3

値の配列 (たとえば int) を作成し、関数からこの配列を返したい場合はブロック引用します。

以下はC#でこれを行います

public int[] Example(int size)
{

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

}

また、ローカル変数を直接 (ポインターを介してではなく) 返す場合、この変数に割り当てられたメモリがランタイムによって再利用されるのはいつですか? 返された値がこの値の受信者に割り当てられた後ですか?

ポインターを返さない場合は、ローカル変数のコピーを返すだけです。あなたの質問の2番目の部分は意味がありません。

関連するもう 1 つの質問は 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 に答える