動的に割り当てた構造体配列のサイズを求めるにはどのようにすればよいのでしょう
か。
たとえば以下のようなコードがあったとして
①の処理が終わったあとで
構造体配列のサイズや要素数こうを求めたいです。
int main(int argc, char* argv[])
{
Sel *sel;
int a;
a = DR(&sel); ←------- ①
for(int i=0;i<10;i++){
printf(%d\n,sel[i].a);
}
free(sel);
return 0;
}
int DR(Sel **sel)
{
*sel = (Sel*)malloc(sizeof(Sel)*10);
for(int i=0;i<10;i++){
strcpy((*sel)[i].id,");
strcpy((*sel)[i].id,111111);
(*sel)[i].a = i;
}
return 0;
}
構造体の定義
typedef struct _Sel_{
int a;
char id[7];
}Sel;
> int DR(Sel **sel);
上記の関数に引数を一つ追加して…。
int DR(Sel **sel, int *obj_count );
…のようにし、DR関数の中で確保した個数を呼び出し元(main関数)に返す
のではダメでしょうか?
上記で要素数はわかります。サイズはSel型オブジェクトのサイズに要素数を
かけるということで…。
はずしてたらごめんなさい。
DRを呼び出すほうの関数(ここではmain)の中で
sizeofなどを使ってサイズを求めたいと考えています。
その方法がわからなくて質問しました。
DRの引数などはそのままという条件でお願いします。
_msize() とかでいいんでしょか。
意味を取り違えてたらすみません。
取得することはできません。
というか,ポインタの指す先がオブジェ
クトかその配列かを判別する方法すら存在しません。
現在無意味な関数戻り値を利用するとか,
std::vectorを使うとかしてはどうでしょう。
> DRの引数などはそのままという条件でお願いします。
もし「DR」という関数が他人の管理下にあって、呼び出し元では何も手を
加えることができないということですと、後述の方法も当然駄目という事に
なってしまうんですが、最後の手段としてはグローバル変数を使ってしまう
という道も残されています。
これなら、引数も戻り値も手を加えることなく、DRからmainにサイズの情
報を渡せますが、極めて推奨されない実現方法になりそうです。