指针没有指向

时间:2013-06-23 11:47:00

标签: c pointers struct

我有这个'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;实际上改变了打印的值。

2 个答案:

答案 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;