如何在没有影响删除的情况下指向一个对象?

时间:2014-08-28 07:47:42

标签: c pointers memory

struct object
{
   char* whatever;
}
struct other_object
{
   object** points;
   int number;
}

void add_to_points(other_object* passer, const struct object* object_ptr)
{
   passer->points[passer->number] = object_ptr; //leads to warning
   number++;
}

void delete_memory(other_object* passer)
{
   int i;
   for(i = 0; i < passer->numbers; i++){
      free(passer->points[i]);
   }
}

struct object* new_object = malloc(sizeof(object));
struct other_object* new_object_2 = malloc(sizeof(other_object));
new_object_2->points = malloc(3*sizeof(object));

add_to_points(new_object_2, new_object);
delete_memory(new_object_2);

所以使用上面的代码,似乎delete_memory实际上是释放对象本身。我知道这可能与我的add_to_points函数有关,但是我不清楚如何更改它以便“points”仅指向对象,但是如果我们删除一个点的成员(例如points [2])或者整个事物,物体本身并没有被破坏。

2 个答案:

答案 0 :(得分:0)

您必须使用new_object_2->points而不是object*object调用malloc。你似乎想要像对象那样想要对象的数组而不是对象数组。

替换

new_object_2->points = malloc(3*sizeof(object));

new_object_2->points = malloc(3*sizeof(object*));

答案 1 :(得分:0)

void add_to_points(other_object* passer, struct object* object_ptr)
{
    if (passer->number < 3) {
        passer->points[passer->number] = object_ptr; //leads to warning
        (passer->number)++;
    }
}

您在number中使用了错误的add_to_points变量。 passer->number是正确的。也不要忘记在malloc之后初始化此变量。此外,在将内容写入3之前,您应首先将其测试为小于passer->points[passer->number]。警告来自参数列表中的const