• ベストアンサー

C言語の配列をPush(追加)するには

C言語の配列をPush(追加)するには タイトル通りなのですが、OPENCVにあるcvSeqPushのように 配列の末尾に新たな数値を追加する関数はあるのでしょうか?? できれば、簡単なサンプルコードもしくはそれが掲載されているページを紹介していただくと とても助かります。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

標準関数にはありません。 作るなら、新たに現在の配列のサイズに要素1つ分のサイズを増やしたメモリ領域を新たに獲得し、そこに既存の配列をコピーしてから一番最後の要素に新しい要素を追加するしかありません。 #include <stdio.h> #include <memory.h> #include <stdlib.h> void *array_push(void *ptr, int size, size_t unit_size, void *item) { void *adr = malloc(unit_size * (size + 1)); memcpy(adr, ptr, unit_size * size); memcpy((char *)adr + (unit_size * size), item, unit_size); return(adr); } int main(void) { char array_one[] = {'0', '1', '2', '3', '4'}; char *array_ptr = array_one; int array_size = sizeof(array_one) / sizeof(array_one[0]); char additem = '5'; printf("配列の%d番目の要素は 0x%X ですよ\n", array_size - 1, array_ptr[array_size - 1]); array_ptr = (char *)array_push(array_ptr, array_size, sizeof(array_ptr[0]), &additem); printf("新しい配列の%d番目の要素は 0x%X ですよ\n", array_size - 1, array_ptr[array_size - 1]); array_size++; printf("新しい配列の%d番目の要素は 0x%X ですよ\n", array_size - 1, array_ptr[array_size - 1]); free(array_ptr); getchar(); return(0); }

a0672113
質問者

お礼

ありがとうございます! とても参考になりました。

その他の回答 (2)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

Cの配列は固定長なので、「新たな要素を増やす」ことは不可能です。 動的にやりたければmallocとreallocを駆使するしかありません。 なおC++では、これを隠蔽するSTLのvectorテンプレートクラスが存在します。

a0672113
質問者

お礼

やはりできないんですね。 ありがとうございました。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

ありません。あきらめましょう。 C言語の配列はその定義時に要素数(正確には配列が必要とするバイト数)が固定されてしまい、その要素数を後から変更することはできません。 cvSeqPushで末尾に新たな値を追加できるのは、その関数が扱う構造体CvSeqが要素の追加・削除を行える構造になっていて、関数内でいろいろと処理をやっているからです。 # opencvは知りませんでしたが、リファレンス(参考URL)を斜め読みしたところどうやら双方向リストを使用しているようです。 つまり、ただの配列に対して末尾追加を行っているわけではありません。

参考URL:
http://opencv.jp/opencv-1.0.0/document/opencvref_cxcore_sequences.html
a0672113
質問者

お礼

なるほど、何やらややこしいですね。 お返事ありがとうございました。

関連するQ&A