-1

ローカルの静的/グローバル変数へのポインターを返す関数を、C++ と同様に C で左辺値として使用できるかどうか疑問に思っていたので、試してみたところ、これは可能のようです。たとえば、次の単純な関数を考えてみましょう。


int* d(int a){
    static int* array = NULL;
    static int size = 0;
    if(a+1 > size){
        size = 2*(a+1);
        array = realloc(array, size * sizeof(int));
    }
    if(a == -1){
        free(array);
        return NULL;
    }
    return array + a;
}

これは単純な動的配列です。たとえば*d(30) = 2、 を実行できますが、コンパイル単位ごとに関数のインスタンスを 1 つしか持てないため、これはあまり役に立ちません。

したがって、C でこの概念の興味深い用途があるかどうかを尋ねたいと思います。実際のアプリケーションもいいでしょう。

4

2 に答える 2

0

この例は、再割り当てのために危険です。呼び出し元がポインターで何をするかを制御することはできません。検討:

  *d(0)=0;
   int* insertPoint = d(1); //save for later
   *d(2)=2;  //forces realloc.
   *insertPoint = 1; //CRASH, points to freed memory.

動的配列は、この手法の適切な使用例ではないと思います。

- 編集 -

ローカルの静的/グローバル変数へのポインターを返す関数を左辺値として使用できるかどうか疑問に思っていました...

それらは可能ですが、ご指摘のとおり、コンパイル単位ごとに 1 つしか存在できません。したがって、実際にはグローバル変数のラッパーになります。または、ローカルの静的をグローバルのように機能させる方法。したがって、ほとんどのユースケースでは、非標準構文を使用して標準操作を実行するだけです。

この技術が使われているのを見たことがありません。私が考えることができる唯一の用途は、ある種のシングルトン構造を提供することでした。

于 2013-01-30T21:24:19.233 に答える