2次元配列のサイズを可変にするためにmallocとreallocで、各行の要素数が違う配列を使ったプログラムを作成していたのですが、
どこかでおかしな操作をしているらしく動作が非常に不安定になっていて、
原因調べてみたところとreallocが返却アドレスを変更した時が原因だと推測できました。(そのあと再度reallocしようとすると止まる)
以下のコードに示すようなデータの管理方法を行っています。(これだけだと普通に動きますが、危険なコーディングをしてるかもしれません)
#define LAYER_MAX 6
#define ARRAY_MAX_DEF 80
typedef struct {
short a0;
char a1;
char a2;
}TEST0_t;
typedef struct{
TEST0_t b0[LAYER_MAX];
short b1;
short b2;
} TEST1_t;
int *g_cellsize;
TEST1_t **g_cells;// これにデータを入れる
void InitTEST1_t(TEST1_t*fcell_){// test1_t型オブジェクトを初期化する関数
for (int rp_i=0; rp_i<LAYER_MAX; rp_i++) {
fcell_->b0[rp_i].a0=0;
fcell_->b0[rp_i].a1=0;
fcell_->b0[rp_i].a2=0;
}
fcell_->b1=0;
fcell_->b2=0;
}
void PointerRealloc(TEST1_t*fcell_,// サイズを変更する配列
int nowsize,// 現在の配列サイズ
short tosize// 拡張する配列サイズ
){// TEST1_t 型の配列サイズを変更する関数
// (この関数に原因がある?)
// fcell_の元々の値を保持
TEST1_t *pre_cell_;
pre_cell_= (TEST1_t*) malloc(sizeof(TEST1_t)*nowsize);
for (int rp_i=0; rp_i<nowsize; rp_i++) {
pre_cell_[rp_i]=fcell_[rp_i];
}
// fcell_のサイズの変更
fcell_=(TEST1_t*)realloc(fcell_,sizeof(TEST1_t)*tosize);
// fcell_の初期化
for (int rp_i=0; rp_i<tosize; rp_i++) {
InitTEST1_t(&fcell_[rp_i]);
}
// fcell_に値を再代入
for (int rp_i=0; rp_i<tosize&&rp_i<nowsize; rp_i++) {
fcell_[rp_i]=pre_cell_[rp_i];
}
}
void appmain(){
printf("start\n");
int tosize=140;// 列配列サイズ
// 確保
g_cells = (TEST1_t**)malloc(sizeof(TEST1_t*)*ARRAY_MAX_DEF);// 行配列を動的確保
g_cellsize = (int*)malloc(sizeof(int)*ARRAY_MAX_DEF);
for (int sti=0; sti<ARRAY_MAX_DEF; sti++) {
g_cellsize[sti]=tosize;
g_cells[sti]= (TEST1_t*) malloc(sizeof(TEST1_t)*g_cellsize[sti]);// 列配列を動的確保
for (int rp_i=0; rp_i<g_cellsize[sti]; rp_i++) {
InitTEST1_t(&g_cells[sti][rp_i]);// 初期化
}
}
// 配列サイズの変更テスト
tosize=200;// 配列サイズを140から200に変更する
for (int sti=0; sti<ARRAY_MAX_DEF; sti++) {
PointerRealloc(g_cells[sti],g_cellsize[sti],tosize);
g_cellsize[sti]=tosize;
for (int i=0; i<tosize; i++) {
g_cells[sti][i].b1=sti;
}
printf("%d\n",g_cells[sti][tosize-1].b1);
}
}
具体的には、
バグの原因、またはもしこのデータ構造を実現するために別の手段があればアドバイスを頂ければ幸いです。
宜しくお願いします。