使用双指针为结构的成员赋值
Assign value to member of struct using double pointer
我有一个函数,它接受指向结构的双指针并分配一个值。但是我得到一个"访问冲突写作位置......"尝试访问成员member1
时。这是我的代码:
struct mystruct{
unsigned int member1;
void * data;
};
int main(){
mystruct **foo = new mystruct *;
bar(foo);
}
void bar(unsigned int val, mystruct ** foo)
{
(*foo)->member1 = val;
}
您刚刚创建了一个新的 mystruct 指针。这意味着:
你被分配了一个内存块,足够大,可以容纳一个地址,并将其分配给指向指向mystruct
成员的指针的指针。这并不意味着指针中存在有效的地址保留,您希望指向mystruct
元素。更目前甚至没有一个有效的地址,指向指针的指针指向哪里,因为你刚刚给它分配了一个有效的内存区域,这并不意味着有一个有用的地址存储在其中。
所以,你想要的是:
您需要一个具有有效内存块的指针来存储另一个指针的地址,该指针指向有效的内存区域,其中存储了一个(可能是有效的)mystruct
。
做的是:您正在请求一个内存区域,您可以在其中(您甚至没有做的事情)将一个 poitner 存储到另一个指针......等等。
所以你应该做的是:
mystruct **foo = new mystruct *;
*foo = new mystruct;
我有一个接受双指针的函数
这很奇怪。如果可以,请简化它以引用:
void bar(unsigned int val, mystruct & foo) {
foo.member1 = val;
}
mystruct foo;
bar(42, foo);
如果您无法控制该函数,则需要在指针尾迹的末尾添加一个对象:
mystruct foo;
mystruct * pointless = &foo;
bar(42, &pointless);
当然,如果你真的愿意,你可以弄乱new
;但这几乎肯定是一个坏主意。
您的代码分配并泄漏一个指针,但不将其初始化为指向有效对象;因此取消引用它会给出未定义的行为。
这个 C 风格的函数:
void bar1(mystruct* foo) {
foo->member1 = val;
}
获取类型 mystruct*
的参数,以便对foo
指向的对象所做的更改对调用方可见。但是这个函数:
void bar(unsigned int val, mystruct ** foo) {
(*foo)->member1 = val;
}
获取指向mystruct*
的指针(最有可能)是为了修改指针本身,即为了使对指针所做的更改对调用者可见,因此可能打算以这种方式使用:
mystruct* foo = new mystruct;
bar(&foo);
。然而,通常避免动态分配是合理的,传递指针应该比常见做法更罕见。首选具有自动存储持续时间的对象而不是动态分配的对象,并且更喜欢通过引用传递而不是通过指针传递(如果可能)。
其他答案是很好的建议。而且,如果您可以控制bar
函数,并且需要能够bar
更改为mystruct *
指针指向的对象(这可能是您首先拥有双指针的原因),那么最干净的方法是使用以下签名进行bar
:
void bar(unsigned int val, mystruct * &foo);
它通过引用传递指针,因此您可以更改为指针指向的对象,而不会牺牲代码的可读性,例如:
int main()
{
mystruct * foo = new mystruct;
bar(42, foo);
}
void bar(unsigned int val, mystruct * &foo)
{
foo->member1 = val;
foo = new mystruct;
}
没有内存泄漏的完整使用方案可能是:
int main()
{
// allocate dynamically a mystruct whose member1 is equal to 1.
mystruct * foo1 = new mystruct;
mystruct * foo2 = foo1;
foo1->member1 = 1;
// pass by reference foo1
bar(42, foo1);
// here, foo1->member1 == 42 and foo2->member1 == 10
// free memory
delete foo1; // the one allocated in bar()
delete foo2; // the one allocated in main()
}
void bar(unsigned int val, mystruct * &foo)
{
// modify the object allocated in main()
foo->member1 = 10;
// allocate dynamically a mystruct, store its address in foo
foo = new mystruct;
foo->member1 = val;
}
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 清除具有已删除赋值运算符的成员的类实例
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 静态成员函数赋值而不带返回语句
- 我们可以直接为任何数据成员赋值. 为什么要使用构造函数?
- 通过迭代器为映射的成员赋值
- 为什么不能为基类的成员赋值?
- 如何使用其他函数返回的值为结构体成员赋值
- C++:为类中对象的数据成员赋值
- 如何为所有结构成员赋值
- 使用双指针为结构的成员赋值
- C++:成员赋值如何工作
- 用方法代替成员赋值
- 在c++中快速将基对象的所有成员赋值给派生对象
- 返回值函数中结构成员赋值的额外拷贝
- 将pair的成员赋值给变量
- c++在使用类方法给成员赋值时每次都会崩溃
- 成员赋值笛卡尔类 c++
- c++扑克游戏中的数据成员赋值