1

Obj-C オブジェクトではない場合、myFunction() が返すポインターの値が使用可能であることを確認したいと思います。

double * vectorComponents ();   //Just an example

double * vectorComponents ()
{
    double componentSet[] = {1, 2, 3};
    return componentSet;
}

これらの変数を動的に割り当ててから、それらの割り当てを解除する方法を教えてください。私が何もしなければ、うまくいきません。みんな、ありがとう。

NSLog(@":)");
4

3 に答える 3

5

C 標準ライブラリ関数malloc()と以下を使用できますfree()

double *vectorComponents()
{
    double *componentSet = malloc(sizeof(*componentSet) * 3);
    componentSet[0] = 1;
    componentSet[1] = 2;
    componentSet[2] = 3;
    return componentSet;
}

double *comps = vectorComponents();

// do something with them, then
free(comps);

(ドキュメンテーション)

また:

私が何もしなければ、うまくいきません。

おそらく、未定義の動作を引き起こすため、機能しなかったことに言及する価値があります。componentSetあなたのコードでは、ローカルの自動配列でした-スコープの最後で無効化されます(つまり、関数が戻るときに割り当てが解除されます-まさにあなたが望んでいないことです。

于 2012-12-04T18:58:07.980 に答える
2

関数で動的に割り当てたポインターを返す場合、呼び出し元はオブジェクトの所有権を持ち、値を解放する必要があります。

/**
* Returns ownership, use free to release the value when done.
*/
double * vectorComponents()
{
    double *componentSet = malloc(sizeof(double) * 3);

    componentSet[0] = 1.0;
    componentSet[1] = 2.0;
    componentSet[2] = 3.0;

    return componentSet;
}

void example()
{
    double *components = vectorComponents();

    //use components

    free(components);
}
于 2012-12-04T18:59:57.737 に答える
1

あなたの例を考えると、最初の質問は、動的割り当てが本当に必要ですか? 関数内で初期化された配列のアドレスを返したい場合は、static変数を使用できます。

double * vectorComponents ()
{
   static double componentSet[] = {1, 2, 3};
   return componentSet;
}

動的配列が必要な場合は、それを行う方法がたくさんあります。配列を計算するとmalloc()、ストレージをfree()後で編集できます。動的配列を初期化したい場合は、値を変更してそれを返し、静的配列を使用してそれを行うことができます。例えば:

double * vectorComponents2 ()
{
   static double componentSet[] = {1, 2, 3};
   double *dynamic = malloc(sizeof(componentSet));
   memcpy(dynamic, componentSet, sizeof(componentSet)); // copy values
   // modify contents of dynamic here if needed
   return dynamic;
}

静的配列を使用するmemcpyと、個々の値を設定するよりも短く、配列の内容とサイズを簡単に変更できます。

于 2012-12-04T23:05:37.877 に答える