1

宿題の場合、文字列の配列(構造体にある)にメモリを割り当てる関数を定義する必要があります。

各文字列の長さは次のとおりです。MAX_WORD_LEN+1(= 10 + 1)len文字列の数にメモリを割り当てる必要lenがあり、入力で受信されます。

文字列定義の配列を使用した構造体(指定):

struct dict{
    int len;
    char (*dict0)[MAX_WORD_LEN+1];
    char (*dict1)[MAX_WORD_LEN+1];
};

宣言がわかりませんchar (*dict0)[MAX_WORD_LEN+1];

  • 関数宣言も与えられます:
    void createDict(struct dict * myDict);

これは私が書いたものですが、それが機能するかどうかはわかりません。コンパイラでチェックするのに苦労しています。また、このWebサイトや他のWebサイトからの投稿に基づいて作成しましたが、実際には理解していません。

オプション1:

void createDict(struct dict* myDict)
{

    myDict->(*dict0) =  malloc( (myDict->len)*sizeof(char*));
    myDict->(*dict1) = (char**) malloc( (myDict->len)*sizeof(char*));

    for(int i=0;i<(myDict->len);i++)
    {
        (myDict->(*dict0)[i]) = (char*)malloc((MAX_WORD_LEN+1)*sizeof(char));
        (myDict->(*dict0)[i]) = (char*)malloc((MAX_WORD_LEN+1)*sizeof(char));
    }
}

オプション2:

(myDict->(*dict0)[MAX_WORD_LEN+1]) = malloc((myDict->len) * sizeof(char*));
(myDict->(*dict1)[MAX_WORD_LEN+1]) = malloc((myDict->len) * sizeof(char*));

説明してください...

4

3 に答える 3

7

まず、次の 3 つの宣言の違いを理解する必要があります。簡潔にするためにN、サイジングに合わせて MAX_WORD_LEN+1であると仮定します。

char data[N];      // array of N chars
char *data[N];     // array of N char *pointers* (i.e. char *)
char (*data)[N];   // pointer to array of N chars

何よりも、ポインタは「アドレス」を保持する変数であり、実装定義です。変数が実装整数の値を保持するようintに、ポインター変数は実装アドレスを保持します。

ほとんどすべての場合、malloc()参照されている基になるターゲットで sizeof() 演算子を使用して、ポインター型の適切なメモリを作成できます。これが直感的でない、または簡単に提示できない場合もありますが、次のことが役に立ちます。

// allocates sizeof(Type) block
Type *p = malloc(sizeof(*p));

// allocates N*sizeof(Type) contiguous blocks
//  note: we'll use this style later to answer your question
Type *pa = malloc(N * sizeof(*pa));

これは何Typeがあっても機能します。あなたの場合、次のように宣言されたポインターがあるため、これは重要です。

char (*dict)[N];

上ですでに説明したように、これはタイプのポインター (pointer-to-N-chars) を宣言します。実際のメモリはまだ割り当てられていないことに注意してください。これは単なるポインターです。もう何もありません。したがって、上記の構文を次のように使用して、単一の要素を安全に割り当てることができます。

// allocate single block
char (*dict)[N] = malloc(sizeof(*dict));

ただし、これは 1 つのエントリにしか対応していません。lenエントリが必要なので、次のようにします。

// allocate 'len' contiguous blocks each N chars in size
char (*dict)[N] = malloc(len * sizeof(*dict));

dict0..(len-1) の配列として安全にアドレス指定できるようになりました。次のようなデータをコピーできます。

strcpy(data[0], "test");
strcpy(data[1], "another test");

ソース文字列が N 文字 (ゼロターミネータを含む) を超えない限り、これは正しく機能します。

最後に、完了したら割り当てを解放することを忘れないでください。

free(dict);

ネタバレ

myDict->dict0 =  malloc( myDict->len * sizeof(*(myDict->dict0)));
myDict->dict1 =  malloc( myDict->len * sizeof(*(myDict->dict1)));
于 2013-03-20T15:41:01.170 に答える
0

構造の宣言では、

char (*dict0)[MAX_WORD_LEN+1];

これは、 MAX_WORD_LEN+1要素の文字配列に対するものでdict0あることを意味します。pointerchar [11]

オブジェクトのフィールドを初期化するために、以下に示す例を検討できます。

void createDict(struct dict* myDict)
{
    myDict->dict0 = &glbarr;
    myDict->dict1 = &glbarr;
}

ここで、glbarrは次のように定義されたグローバル配列です。

char glbarr[MAX_WORD_LEN+1];
于 2013-03-20T15:02:05.300 に答える
0

char (*dict)[MAX_WORD_LEN+1]の配列へのポインタですchar[MAX_WORD_LEN+1]。または、そのような配列の配列 (2 次元配列) として解釈することもできます。

としましょう typedef char MyString[MAX_WORD_LEN+1];

次に、宣言は次のようになります。MyString *dict0; つまり、 はdict0の配列の最初の要素へのポインターにすることができますMyString。そして、これはあなたがすべきことです。

詳細な解決策は投稿しません (先生は満足しないでしょう)。

と の違いを感じてみてchar (*dict)[10];くださいchar *dict[10];

于 2013-03-20T15:04:33.073 に答える