2
typedef struct
{
int id;
char*  first;
char* last;
}* person;

person* people;

やあ。上記のすべてをグローバルに設定して、人々をさまざまな「人」で満たすにはどうすればよいですか? typedef struct ポインターに関して頭を悩ませている問題があります。ポインターが配列のようなものであることは承知していますが、これをすべてまとめるのに問題があります...

上記のコードもそのままにしておきたいと思います。

編集 1: 最初の文字は最初に char* にする必要があります。

4

5 に答える 5

2

構造体のtypedefを気にしないでください。タグ付きの構造体を使用してから次のことを行うと、はるかに明確になります。

struct PERSON {
    int id;
    char *first;
    char *last;
};

struct PERSON *people;  /* people is a pointer to a struct PERSON. */

/* Allocate array of 42 struct PERSONS. */
people = malloc (42 * sizeof *people);

/* Now use people[0] to people[41]. */
于 2012-09-09T13:08:39.477 に答える
1

本当の型を隠す typedef は悪い考えです。

于 2012-09-09T13:00:28.780 に答える
1

person次のようなものを使用して、タイプの構造体の配列を簡単に作成できます。

people = malloc (num_person * sizeof(person));
for (i = 0; i < num_person; i++) {
     people[i]->first = malloc (size * sizeof(char));
     people[i]->last = malloc (size * sizeof(char));
}

これに続いて、それぞれpeople structに異なるパラメーターを入力できます。

于 2012-09-09T02:39:38.087 に答える
0

本当に二重の間接化が必要な場合は、次のようになります。

people = malloc(sizeof(person));
*people = malloc(SOME_NUMBER * sizeof(**people));

必要なものを割り当てます。個人の構造は次のようになります。

(*people)[INDEX]

特定の person 構造を使用する場合は、firstおよびlast文字列にもメモリを割り当てる必要があります。

(*people)[INDEX].first = malloc(STRING_SIZE);
(*people)[INDEX].last = malloc(STRING_SIZE);

しかし、クレイジーな二重間接参照を削除するだけで、物事が本当にきれいになり、すべてが使いやすく理解しやすくなります。

people = malloc(SOME_NUMBER * sizeof(person));
people[INDEX].first = malloc(STRING_SIZE);
people[INDEX].last = malloc(STRING_SIZE);
于 2012-09-09T03:25:55.197 に答える