正确的方法是让两个指针指向同一个内存块

时间:2015-06-28 19:21:24

标签: c pointers memory memory-management allocation

我有一个结构:

struct generic_attribute{
    int current_value;
    int previous_value;
};

一个构造函数,它输出一个指向这个结构的指针:

struct generic_attribute* construct_generic_attribute(int current_value){
    struct generic_attribute *ga_ptr;
    ga_ptr = malloc (sizeof (struct generic_attribute));
    ga_ptr->current_value = current_value;
    ga_ptr->previous_value = 0;
    return ga_ptr;
}

现在,在另一个函数中,我想定义一个指针并将其设置为指向与上述构造函数输出的指针相同的地址。

struct tagged_attribute* construct_tagged_attribute(int num_args, int *args){
    ...
    struct generic_attribute* generic = malloc (sizeof(struct generic_attribute));
    generic = construct_generic_attribute(args[0]);
    ...
}

在我看来,我在这里做的是:

1)我定义了一个指针“generic”和分配一个内存块来保存generic_attribute结构的实例。

2)我调用一个函数construct_generic_attribute,在该函数中,程序再次分配一个大小为generic_attribute结构的内存块。它输出一个指向此内存块的指针。

3)在construct_tagged_attribute中,我设置“generic”指针等于construct_generic_attribute函数输出的指针,所以现在它们都指向相同的内存槽。

然而,似乎我分配的内存是我需要分配的两倍。

有没有办法让我只分配一次内存而不会因为无法为“通用”指针分配空间而出现分段错误?或者,我是否误解了此代码中发生的事情?

3 个答案:

答案 0 :(得分:2)

struct generic_attribute* generic = construct_generic_attribute(args[0]);

应该做的伎俩。指针变量只是一个变量。您可以将指针值换成数字。

答案 1 :(得分:1)

  1. 是的,你是误会,但我无法弄清楚你认为发生了什么,以解释它是怎么回事。

  2. struct generic_attribute *generic = construct_generic_attribute(args[0]);指针是一种值。如果你指定另一个指针,你会得到两个指向同一个东西的指针,没有任何内存分配。由于C不为您管理内存,因此您需要确保已分配的任何对象只被释放一次,并且在释放后不会尝试使用指向对象的指针。

    < / LI>

答案 2 :(得分:1)

下面

    struct generic_attribute* generic = malloc (sizeof(struct generic_attribute));

你分配一个内存块,大到足以保持generic_attribute结构,然后在generic变量中存储指向该结构的指针(技术上:块的地址)。 注意:您没有初始化结构成员。

然后在

    generic = construct_generic_attribute(args[0]);

你调用一个函数,它在内部分配(另一个)内存块并初始化它并返回一个指针(在函数执行期间存储在ga_ptr变量中)。然后将返回的指针分配给generic变量,用前一条指令覆盖存储在那里的值。因此,您无法访问第一个已分配的结构。

修改

我担心我不太明白你想要实现的目标。如果你想要两个指向同一结构的指针,只需声明ga1并为其指定一个指向所创建结构的指针:

    struct generic_attribute *ga1 = construct_generic_attribute(args[0]);

然后复制指针:

    struct generic_attribute *ga2 = ga1;