0

これを定義した場合:

typedef char word[30];
typedef struct {
    int num;
    word group[30];
} paragraph;

そして、本体で:

int

main(int argc, char **argv) {

    paragraph p;

    word w = "BLA";

    return 0;

}

配列 p に w を割り当ててから、p に関して printf w を割り当てるにはどうすればよいですか

私はこれが間違っていることを知っていますが、例えば:

    p[][1] = w;

    printf("%s", p[][1]);

初心者を助けてください

4

2 に答える 2

4

配列は代入できません。配列を適切なサイズに初期化し、必要に応じて各要素を設定するか、代わりにポインターを格納します。

于 2012-09-10T00:15:23.647 に答える
2

C99で導入された柔軟な配列メンバーを実際に使用するつもりであると仮定すると、次のようなコードを記述する必要があります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char word[30];
typedef struct {
    int num;
    word group[];
} paragraph;

int main(void)
{
    paragraph *p = malloc(sizeof(*p) + 1 * sizeof(word));
    word w = "BLA";
    strcpy(p->group[0], w);
    printf("Word: %s\n", p->group[0]);
    free(p);
    return 0;
}

それは適度にトリッキーなコードです。これが何をしているのかを理解するまで、柔軟な配列メンバーの使用は避けてください。それまではgroup、段落のメンバーをword:にします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char word[30];
typedef struct {
    int num;
    word group;
} paragraph;


int main(void)
{
    paragraph p;
    word w = "BLA";
    strcpy(p.group, w);
    printf("Word: %s\n", p.group);
    return 0;
}

重要な点は、配列を直接割り当てることはできず、文字列や他のタイプの相対配列を使用する必要があるということですstrcpy()。一般に配列を含む構造体を割り当てることができますが(ただし、柔軟な配列メンバーを含む構造体では割り当てることができません)、構造体の割り当てを行うことができ、構造体に配列が含まれているのは偶然です。memmove()memcpy()


しかし、単語グループの場合、group [30]を配置すると、それは残りのコードにどのように影響しますか?

あなたが尋ねるように行うコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char word[30];
typedef struct
{
    int num;
    word group[30];
} paragraph;

int main(void)
{
    paragraph p;
    word w = "BLA";
    strcpy(p.group[0], w);
    printf("Word: %s\n", p.group[0]);
    return 0;
}

この構造では、を仮定すると、30語の配列を宣言したため、各単語は30文字の配列であることsizeof(int) == 4がわかります。sizeof(paragraph) == 904この構造により、段落に複数の単語を追加できます(そして、私が書いたほとんどの段落には、確かに複数の単語が含まれています!)。あなたはまだstrcpy()単語をwからの要素にコピーするために使用する必要がありますp.group

int main(void)
{
    paragraph p;
    word w = "BLA";
    strcpy(p.group[0], w);
    strcpy(p.group[1], "Porcupine");
    strcpy(p.group[2], "Elephant");
    p.num = 3;
    printf("Word: %s\n", p.group[0]);
    printf("Paragraph:");
    for (int i = 0; i < p.num; i++)
        printf(" %s", p.group[i]);
    putchar('\n');
    return 0;
}

typedeflikeを使用するのは間違いではありませwordんが、私が通常行うことではありません。それはすべて、悟りよりも混乱を招きやすいのです。また、ほとんどの単語の長さが29文字より大幅に短い場合は、メモリの浪費につながる可能性があります。(配列要素に29文字(および終了ヌルバイト)より長い単語を格納しないようにする責任はあなたにありますp.group。)OTOH、64ビットソフトウェアでのメモリ割り当てのオーバーヘッドにより、無駄なスペースが簡単にレンダリングされる可能性があります。一言で言えば議論の余地があります。

于 2012-09-10T00:27:56.337 に答える