0

我有这个代码:

#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
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 回答
1

忽略这些sizeof()问题,这里的问题是您正在通过执行以下操作制作_TYPE_Object给定字段的显式副本createObject(),包括位置:

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

因此,当您更改原件(通过 )时,没有理由修改副本(这是您正在打印的内容)中的位置smile.position.x = 55

如果要插入对原始对象的引用而不是复制,则必须创建一个指针数组而不是对象数组本身。

于 2013-06-23T12:02:15.427 回答