0

私はこの「ereコードを持っています:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// Library stuff

typedef struct {
    int x, y;
} _TYPE_position;

typedef struct {
    char image[32];
    _TYPE_position position;
} _TYPE_object;

_TYPE_object *object;

int createObject(const _TYPE_object *insertionObject);
int createObject(const _TYPE_object *insertionObject) {
    int index;
    _TYPE_object *newObjectPtr = realloc(object, sizeof(*object) + sizeof(_TYPE_object));
    if(newObjectPtr != NULL) {
        object = newObjectPtr;
        index = sizeof(*object) / sizeof(_TYPE_object) - 1;
        strcpy(object[index].image, insertionObject->image);
        object[index].position = insertionObject->position;
    }
    else {
        index =- 1;
    }
    return index;
}


// Demo program

int main(void) {

    _TYPE_object smile = {
        "smile.png", { 112, 80 }
    };

    int smileIndex = createObject(&smile);

    if(smileIndex == -1) {
        printf("Error allocating memory for smile object");
        while(1);
    }

    smile.position.x = 55; // Does nothing since the object does not point here for some reason

    int i;
    for(i = 0; i < sizeof(*object) / sizeof(_TYPE_object); i++) {
        printf("Create %s at { %d, %d }\n", object[i].image, object[i].position.x, object[i].position.y);
    }

    return 0;
}

そして、それは一種の作品です。object は _TYPE_object を指していないようですが、代わりにその正確なコピーを作成しています。

オブジェクトを再作成するだけでなく、オブジェクトを指すようにする方法はありますか。したがって、上記の例では、smile.position.x = 55; があります。実際に出力される値を変更します。

4

2 に答える 2

1

問題を無視するsizeof()と、ここでの問題は、次のようにして、位置を含め、 に_TYPE_Object指定されたフィールドの明示的なコピーを作成していることです。createObject()

object[index].position = insertionObject->position;

そのため、オリジナルを ( を介して) 変更するときに、コピー (印刷するもの) の位置を変更する必要はありませんsmile.position.x = 55

元のオブジェクトへの参照を挿入し、コピーを作成しない場合は、オブジェクト自体の配列ではなく、ポインターの配列を作成する必要があります。

于 2013-06-23T12:02:15.427 に答える
1
index = sizeof(*object) / sizeof(_TYPE_object) - 1;

これは、すでに割り当てられているオブジェクトの数を通知することを意図していると思いますが、間違っています。 *object配列全体を参照するのではなくobject[0]、配列内の最初の項目のみを参照します。また、内部の式sizeofをまったく参照または計算しないため、コードは次と同等です。

index = sizeof(_TYPE_object) / sizeof(_TYPE_object) - 1;

次のようなものを使用することをお勧めします。

int objects_allocated = 0;
int objects_used = 0;
_TYPE_object *object = NULL;

sizeof余計な表現も多用しています。割り当てのサイズを決定する必要がありsizeofますが、配列にインデックスを付ける場合は必要ありません。言い換えると:

&(object[n]) == ((void *)object) + n*sizeof(_TYPE_object)

また、各メンバーを明示的にコピーする必要もありません。以下を使用できます。

object[index] = *insertionObject;
于 2013-06-23T14:41:18.010 に答える