0

C++ での新しい構造体の初期化に関して質問があります。私はc ++が初めてです。

typedef struct 
{
   int n;
   char anArray*;
}  myStruct;

void newStruct ( myStruct **ms, int x)
{
   myStruct* local_ms = new myStruct;
   local_ms->n = x;
   local_ms->anArray= new char[sizeof(char)*n];
   ms = &local_ms;
}

void ポインターを使用して newStruct を呼び出す場合、myStruct にメモリを割り当ててから、新しい構造体へのポインターをミリ秒単位で格納して、後で使用できるようにすることを意図しています。残念ながら、local_ms はスコープ内でのみローカルであるため、newStruct から戻ると失われると思います。

そうは言っても、myStruct を適切に初期化する方法がわかりません! 考え?

4

3 に答える 3

1

「local_ms はスコープ内でのみローカルであるため、newStruct から戻ると失われると思います。」

変化する:

ms = &local_ms;

に:

*ms = local_ms;

newStructにオブジェクトのポインターを割り当てる問題を回避するのに役立ちます*ms

于 2013-09-10T10:59:31.587 に答える
0
ms = &local_ms;

これにより、ローカルポインターが、割り当てられた構造体への他のローカルポインターを指すように変更されます。ただし、必要なのは、呼び出し元のポインターを変更することです。はそれへのポインターであるため、次を指すものを変更します。msmsms

*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);
于 2013-09-10T12:55:26.210 に答える