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
現在、1 つだけ不足しています: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);