我有这个'ere code:
#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;
}
它有点有效。似乎对象没有指向_TYPE_object,而是创建了它的精确副本。
有没有办法让对象数组指向对象,而不是仅仅重新创建它们。所以在上面的例子中有smile.position.x = 55;实际上改变了打印的值。
答案 0 :(得分:1)
忽略sizeof()
个问题,这里的问题是您正在通过以下方式明确复制_TYPE_Object
createObject()
字段,包括位置:
object[index].position = insertionObject->position;
因此,当您更改原件(通过smile.position.x = 55
)时,没有理由修改副本中的位置(这是您要打印的内容)。
如果要插入对原始对象的引用而不进行复制,则必须创建一个指针数组而不是一个对象数组本身。
答案 1 :(得分: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;