- 締切済み
C言語で配列の連結について教えてください
以下のような構造体でmember[]の要素の後にmember2[]の要素を追加して、member[]を返す関数を作りたいのですがやり方がわかりません。よろしくお願いします。 (C++ vectorのpush_back、phpのarray_push()に相当する関数) typedef struct _MEMBER { char *name; int age; char *address; } MEMBER; MEMBER member[] = { "山田", 25, "東京都aaaaa", "木村", 30, "東京都bbbbb", "森田", 24, "東京都ccccc", }; MEMBER member2[] = { "伊藤", 23, "大阪府ddddd", "山野", 31, "大阪府eeeee", };
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- titokani
- ベストアンサー率19% (341/1726)
無理です。 Cの配列は後からサイズを増やすことはできません。 だから、C++でvectorがあるのですし、Cでなんとかするのなら、mallocなどを使って、member,member2とは別にメモリを確保するなどします。 あるいは、 MEMBER member[5] = { "山田", 25, "東京都aaaaa", "木村", 30, "東京都bbbbb", "森田", 24, "東京都ccccc", }; MEMBER member2[] = { "伊藤", 23, "大阪府ddddd", "山野", 31, "大阪府eeeee", }; などとして、あらかじめmemberを必要なサイズ分用意するとかですね。
- asuncion
- ベストアンサー率33% (2127/6289)
愚直な例です。 #include <stdio.h> #include <stdlib.h> typedef struct _MEMBER { char *name; int age; char *address; } MEMBER; MEMBER *memcat(MEMBER *member, int sz, MEMBER *member2, int sz2) { MEMBER *mem; int i, j; mem = (MEMBER *) malloc(sizeof(MEMBER) * (sz + sz2)); if (!mem) return NULL; for (i = 0; i < sz; i++) { mem[i] = member[i]; } for (j = i; j < i + sz2; j++) { mem[j] = member2[j-i]; } return mem; } int main(void) { MEMBER member[] = { { "山田", 25, "東京都aaaaa" }, { "木村", 30, "東京都bbbbb" }, { "森田", 24, "東京都ccccc" }, }; MEMBER member2[] = { { "伊藤", 23, "大阪府ddddd" }, { "山野", 31, "大阪府eeeee" }, }; MEMBER *mem; int sz = sizeof(member) / sizeof(member[0]); int sz2 = sizeof(member2) / sizeof(member2[0]); int i; mem = memcat(member, sz, member2, sz2); if (!mem) exit(1); for (i = 0; i < sz + sz2; i++) { printf("%s %d %s\n", mem[i]); } free(mem); return 0; }
- BLK314
- ベストアンサー率55% (84/152)
要素の追加をするなら、配列よりも リンク・リストの方が便利だと思います。 リンク・リストであれば、1レコードであっても、 複数レコードからなるリストであっても、 追加・挿入はポインタをつなぎかえるだけなので 単純かつ高速です。 配列で行きたいなら、次のようにして 追加関数を実装します。 1) 旧配列 + 追加レコード数が収まる分のメモリを確保します。 malloc()等で動的に割り当てます 2) 旧配列のデータを割り当てた領域に全部コピーします。 3) 旧配列のメモリを廃棄します 4) 追加するデータを新規配列にコピーします 2)でコピーし終わった直後のアドレスからコピーします こんな感じです 最小限のことしか書いていません。 実際には、レコード数の更新も必要になるでしょう。 なお、前提として この配列は最初から動的メモリ上に作成されていることが必要です。 静的領域だと拡張できません。 また、最大サイズが最初から見積もれる場合で、 そのサイズが搭載メモリ量に比し、小さい場合 (ex 1GByteの物理メモリに対し、MAX 1MByteとか...) の場合は、 あらかじめ、MAXの容量を確保しておいて 現在格納数を管理する方式で行うと 簡単にできます。 ただし、メモリは無駄になることは承知しておくべきです。