ms = &local_ms;
这会修改本地指针ms
以指向另一个指向已分配结构的本地指针。但是,您想要的是修改调用者的指针。ms
是一个指向它的指针,所以你想修改ms
指向的东西:
*ms = local_ms;
但这不是 C,因此您可以使用更简单的引用语义:
void newStruct ( myStruct *& ms, int x)
// ^^ reference to pointer
{
// ...
ms = local_ms;
}
// usage
myStruct * ms;
newStruct(ms, 42);
但是语言(C 或 C++)提供了一种从函数返回值的更简洁的方法:您可以从函数返回值。
myStruct * newStruct(int x)
{
// ...
return local_ms;
}
// usage
myStruct * ms = newStruct(42);
但是在 C++ 中,我们可以使用构造函数而不是任意函数来初始化新对象:
struct myStruct { // no need for that typedef nonsense
explicit myStruct(int n) :
n(n),
anArray(new char[n]) // sizeof(char) is 1 by definition
{}
int n;
char *anArray; // * goes before the variable name
};
// usage
myStruct ms(42); // don't use `new` unless you really need it
现在只缺少一件事:anArray
永远不会被删除,导致内存泄漏。最简单的解决方法是使用标准库中的动态数组类型:要么string
要么vector
.
struct myStruct {
explicit myStruct(int n) : n(n), anArray(n) {}
int n;
std::string anArray;
};
但当然,n
现在是多余的;你应该摆脱它并使用它anArray.size()
。这意味着结构本身毫无意义。您只需要
std::string ms(42);