让两个指针指向同一个内存块的正确方法
Proper way to have two pointers point to the same memory chunk
我有一个结构:
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函数输出的指针,所以现在它们都指向同一个内存槽。
但是,我分配的内存似乎是我需要分配的内存的两倍。
有没有办法让我只分配一次内存,而不会因为未能为 "generic" 指针分配 space 而出现分段错误?或者,我是否误解了这段代码中发生的事情?
struct generic_attribute* generic = construct_generic_attribute(args[0]);
应该可以解决问题。指针变量就是一个变量。您可以像交换数字一样交换指针值。
是的,你误会了,但我不太明白你认为发生了什么来解释它是怎么错的。
struct generic_attribute *generic = construct_generic_attribute(args[0]);
指针是一种值。如果你将一个指针分配给另一个,你会得到两个指向同一事物的指针,而无需分配任何内存。由于 C 不为您管理内存,因此您需要确保任何分配的对象只被释放一次,并且您不会在对象被释放后尝试使用指向该对象的指针。
这里
struct generic_attribute* generic = malloc (sizeof(struct generic_attribute));
你分配一个内存块,大到足以保存一个 generic_attribute
结构,然后在 generic
变量中存储一个指向该结构的指针(技术上:块的地址)。 注意:您没有初始化结构成员。
然后在
generic = construct_generic_attribute(args[0]);
你调用了一个函数,它在内部分配(另一个)内存块并对其进行初始化,returns 指向它的指针(在函数执行期间存储在 ga_ptr
变量中)。然后将返回的指针分配给 generic
变量,覆盖由先前指令存储在那里的值。因此,您失去了对第一个分配结构的访问权。
编辑
恐怕我不太明白你想要达到的目的。如果你想要两个指向相同结构的指针,只需声明ga1
并为其分配一个指向创建的结构的指针:
struct generic_attribute *ga1 = construct_generic_attribute(args[0]);
然后复制指针:
struct generic_attribute *ga2 = ga1;
我有一个结构:
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函数输出的指针,所以现在它们都指向同一个内存槽。
但是,我分配的内存似乎是我需要分配的内存的两倍。
有没有办法让我只分配一次内存,而不会因为未能为 "generic" 指针分配 space 而出现分段错误?或者,我是否误解了这段代码中发生的事情?
struct generic_attribute* generic = construct_generic_attribute(args[0]);
应该可以解决问题。指针变量就是一个变量。您可以像交换数字一样交换指针值。
是的,你误会了,但我不太明白你认为发生了什么来解释它是怎么错的。
struct generic_attribute *generic = construct_generic_attribute(args[0]);
指针是一种值。如果你将一个指针分配给另一个,你会得到两个指向同一事物的指针,而无需分配任何内存。由于 C 不为您管理内存,因此您需要确保任何分配的对象只被释放一次,并且您不会在对象被释放后尝试使用指向该对象的指针。
这里
struct generic_attribute* generic = malloc (sizeof(struct generic_attribute));
你分配一个内存块,大到足以保存一个 generic_attribute
结构,然后在 generic
变量中存储一个指向该结构的指针(技术上:块的地址)。 注意:您没有初始化结构成员。
然后在
generic = construct_generic_attribute(args[0]);
你调用了一个函数,它在内部分配(另一个)内存块并对其进行初始化,returns 指向它的指针(在函数执行期间存储在 ga_ptr
变量中)。然后将返回的指针分配给 generic
变量,覆盖由先前指令存储在那里的值。因此,您失去了对第一个分配结构的访问权。
编辑
恐怕我不太明白你想要达到的目的。如果你想要两个指向相同结构的指针,只需声明ga1
并为其分配一个指向创建的结构的指针:
struct generic_attribute *ga1 = construct_generic_attribute(args[0]);
然后复制指针:
struct generic_attribute *ga2 = ga1;