ページの最後に質問が返されました。フルワーキングコード。C自動拡張可能なポインタ配列
こんにちは、私はタイトルで尋ねたことはCでしたいと思いますが、それを達成する方法はわかりません。テンプレートのおかげでC++でこれをやったことがありますが、àla Cです。ここには完全に機能するC++コードがあります:List.h (simple database)
* 私はコードをエミュレートすることができますかどうか私は今疑問に思っています。問題は、ボイド*が解決できないほどのトラブルを引き起こす可能性があるため、回避すべきというリンクを見たことです。
基本的には、変数自体へのポインタを格納する「スマートアレイ」です。 各ポインタのサイズと各構造体のサイズがわかっていれば、単純なmallocとreallocは正しく動作するはずですか?
typedef struct
{
void **list;
// internal
int last_item_index;
size_t element_size; // size of each pointer
int elements; // number of currently allocated elements
int total_size; // >= #elements so that we don't have to always call malloc
int tweak_request_size; // each time the list grows we add this # of elements
} List;
// a shot at an addCopy function
// it deepcopies the object you pass in
List_addCopy(List *db, void *ptr_to_new_element)
{
... // grow **list
// alloc and copy new element
db->list[db->last_item_index+1] = malloc(element_size); // WORKS?
// HOW TO COPY THE ELEMENT TO HERE IF IT IS A STRUCTURE FOR INSTANCE???
...
}
or
// a shot at an assign function
// (allocate the elements yourself then pass the pointer to the List)
List_assign(List *db, void *ptr_to_new_element)
{
db->List = realloc(db->List, element_size*(elements+tweak_request_size));
db->List[db->last_item_index+1] = ptr_to_new_element;
}
// Usage example
List db; // our database
struct funky *now = (funky*)malloc(sizeof(funky));
funky->soul = JamesBrown;
List_addCopy(db, funky);
if (list[0]->soul == JamesBrown)
puts("We did It! :D");
私は外にすべてをALLOCとちょうど私が唯一の問題は**無効と推測リストへのポインタを渡す場合。
リストア可能ですか?要素のアロケートやコピーを行うコールバックでのみですか?
List_assignは可能ですか?私は多くの仕事をして、信頼できないソフトウェアで終わらせたくありません。
どうもありがとうと書面での畳み込みのため申し訳ありません:P
要素のサイズを知っていて、単純なフラットなデータ構造(コピーする必要のあるものへのポインタはありません)の場合は、それを上書きするだけです。 –
@Pemdas:私はそれについて言及したと信じています。 –
それは問題にならないでしょうか? void * * *を使用していますか?私は結果が混在する可能性があるので、void * * *を避けるべきだと言っているスレッドを見た:http://c-faq.com/ptrs/genericpp.htmlありがとう – Alberto