プロが教えるわが家の防犯対策術!

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

タイトル通りなのですが、OPENCVにあるcvSeqPushのように
配列の末尾に新たな数値を追加する関数はあるのでしょうか??

できれば、簡単なサンプルコードもしくはそれが掲載されているページを紹介していただくと
とても助かります。よろしくお願いします。

A 回答 (3件)

標準関数にはありません。



作るなら、新たに現在の配列のサイズに要素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);
}
    • good
    • 3
この回答へのお礼

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

お礼日時:2010/07/30 04:53

Cの配列は固定長なので、「新たな要素を増やす」ことは不可能です。


動的にやりたければmallocとreallocを駆使するしかありません。

なおC++では、これを隠蔽するSTLのvectorテンプレートクラスが存在します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/30 04:54

ありません。

あきらめましょう。

C言語の配列はその定義時に要素数(正確には配列が必要とするバイト数)が固定されてしまい、その要素数を後から変更することはできません。

cvSeqPushで末尾に新たな値を追加できるのは、その関数が扱う構造体CvSeqが要素の追加・削除を行える構造になっていて、関数内でいろいろと処理をやっているからです。

# opencvは知りませんでしたが、リファレンス(参考URL)を斜め読みしたところどうやら双方向リストを使用しているようです。

つまり、ただの配列に対して末尾追加を行っているわけではありません。

参考URL:http://opencv.jp/opencv-1.0.0/document/opencvref …
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/30 04:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!