2

次の構造体があるとします。

typedef struct plane_t Plane;
struct plane_t{
    Point p1;
    Point p2;
    Point p3;
};

typedef struct arrangement_t* Arrangement;
struct arrangement_t{
    //TODO add fields here
    int maxPlanes;
    int curPlanes;
    Plane *planes;
};

そして、私は次の機能を持っています:

Plane planeCreate(Point point1, Point point2, Point point3){

    Plane newPlane = {{point1.x, point1.y, point1.z}, {point2.x, point2.y, point2.z}, {point3.x, point3.y, point3.z}};
    return newPlane;
}

Arrangment_t 構造体内の配列 planes に平面を追加する関数を書いているとします。

次のことができますか?

arrangement->planes[arrangement->curPlanes] = planeCreate(plane.x, plane.y plane.z);

または、この関数を終了すると、この構造体は「消える」ため、次のようにする必要があります。

arrangement->planes[arrangement->curPlanes] = malloc(sizeof(struct plane_t));
    arrangement->planes[arrangement->curPlanes].x=plane.x;
    arrangement->planes[arrangement->curPlanes].x=plane.y;
    arrangement->planes[arrangement->curPlanes].x=plane.z; 
4

3 に答える 3

8

いいえ、消えません。C 関数はオブジェクトを値で返すため、構造体がコピーされます。

さらに、

arrangement->planes[arrangement->curPlanes] = malloc(sizeof(struct plane_t));

コンパイルさえしません -arrangement->planes[arrangement->curPlanes]ポインタではなく構造体です。それがポインターである場合、割り当てを次のように変更すれば、コードは機能します。

arrangement->planes[arrangement->curPlanes]->x = plane.x;

( が指す構造体のメンバーへのアクセスは、 ではなく演算子pを使用して行われます)->.


おそらくあなたが話しているのは、ローカル変数自体を返すことではなく、それへのポインターです。たとえば、次のようになります。

int *wrong_function()
{
    int answer = 42;
    return &answer;
}

は誤りです -answer関数が戻るときに変数は範囲外であり、そのアドレスは無効です (したがって、上記は未定義の動作を引き起こします)。

于 2013-08-02T22:58:37.957 に答える
4

参照(ポインター)ではなく、(実際には構造がコピーされます) で返すため、構造は「消える」ことはありません。

于 2013-08-02T22:58:17.950 に答える
0

「変数が保持される期間を決定することは、意欲的なプログラマーを困惑させるもう 1 つの問題です。キーワード修飾子 static を見てみましょう。この修飾子には、残念ながら、関連するいくつかの目的があります。」use static .... like nlife {5} since 関数またはブロック内で見つかった変数で static が使用されると、変数を破棄したり再割り当てしたりしないようにコンパイラに指示します。変数はコンパイル時に作成され、ゼロに初期化されます。この状況での static の反対は auto (デフォルト) です。関数またはブロック内にあるその変数は、関数またはブロックに入るたびに再割り当てされます。

/* LIFETIME, written 15 May 1992 by Peter D. Hipson */
/* An example of variable lifetime. */
#include <stdio.h> // Make includes first part of file
#include <string.h>
int nLife = {5}; // Initialize to 5, default is 0.
int main(void); // Define main() and the fact that this program doesn’t
// use any passed parameters.
void DisplayLife(void); // Define DisplayLife()
int main()
{
int nCounter = 0;
do
{
int nCountLoop = 0; /* This nCounter is unique to the loop */
nCountLoop += 3; /* Increments (and prints) the loop’s
nCounter */

nLife += nCounter;
printf(“nCountLoop is = %d\n”, nCountLoop);
}
while (++nCounter < 10); /* Increments the function’s nCounter */
DisplayLife();
printf(“Ended, nCounter is = %d\n”, nCounter);
return (0);
}
void DisplayLife()
{
printf(“DisplayLife(), nLife = %d?\n”, nLife);
}

LIFETIME.C では、変数 nLife は main() と DisplayLife() の両方に認識されています。この変数の共有は、許容されるプログラミング手法であり、前述のように一般的に使用されます。前の例で、nLife の宣言が次の場合: static int nLife = {5}; // 5 に初期化します。デフォルトはゼロです。結果は同じだったでしょう。その理由は、このプログラムにはソース ファイルが 1 つしかないためです。したがって、nLife は 1 つのファイルでのみ表示される必要がありました。可能な限り、外部変数を静的にすることを忘れないでください。それらが 1 つのソース ファイルでのみ認識されている場合は、別のソース ファイルの別の関数によって意図せずに変更される可能性がはるかに低くなります。

typedef struct plane_t Plane;
struct plane_t{
Point p1;
Point p2;
Point p3;
};

typedef struct arrangement_t* Arrangement;
struct arrangement_t{
//TODO add fields here
int maxPlanes;
int curPlanes;
Plane *planes;
};

たぶん、void DisplayLife(void) は main(void) とは別なので、void DisplayLife() の外側で nlife+=nCounter を設定し、平面と配置構造体から値を渡すことができます.... ちょっと私は間違っているかもしれません私が打ち負かすことができるものなら何でも私に電話してください =(

于 2016-04-25T04:20:47.237 に答える