C++ 指向指向C+中结构的指针数组的指针+;

C++ 指向指向C+中结构的指针数组的指针+;,c++,data-structures,C++,Data Structures,我需要一些帮助,我正在学习数据结构,我得到了一个任务来编写一个基于指向结构的指针数组的程序,该数组可以添加元素并使用数组执行其他任务。我有下一个级别模型: first level --> net of shops second level --> shop third level --> goods 我已经为这个写过了 typedef struct { QString date; QString prod_code; QStri

我需要一些帮助,我正在学习数据结构,我得到了一个任务来编写一个基于指向结构的指针数组的程序,该数组可以添加元素并使用数组执行其他任务。我有下一个级别模型:

first level --> net of shops
    second level --> shop
        third level --> goods
我已经为这个写过了

typedef struct
{
    QString date;
    QString prod_code;
    QString name;
}goods;



typedef struct
{
    QString address;
    QString number;
    void **sublevel;
}shop;

typedef struct
{
    QString website;
    QString name;
    QString owner;
    QString address;
    void **sublevel;
}net;
然后我创建了全局变量void**Start,它指向指针数组:

// init list

void ** init_list()
{
    void** p = new void*[SIZE_AR];

    p = p+2;
    ((int*)p)[COUNT_POS] = 0;
    ((int*)p)[SIZE_POS] = SIZE_AR;

    return p;
}
 void ** Start = init_list();

COUNT_POS - index of elements where I store count of currently used elemnets
SIZE_POS - size of array allocated in dynamic memory
SIZE_AR - default size for array
但当我试图将元素添加到最后一级时,我会遇到分段错误 (对于前两个工程,罚款):

//如果数组填充过多,则展开数组
空隙膨胀率(空隙**&ar、内部和尺寸、内部Cnt)
{
无效**arW;
arW=新空隙*[SizeAr+DELTA+2];
对于(int K=SizeAr-1;K>=0;K--){
arW[K+2]=ar[K];
}
SizeAr=SizeAr+DELTA;
ar=ar-2;
删除[]应收账款;
ar=arW+2;
((int*)ar)[COUNT_POS]=Cnt;
((int*)ar)[SIZE_POS]=SizeAr;
}
//二进制搜索
void bin_搜索(void**start,QString键,int&pos,bool&find,Cmpmethod func)
{
int mid;
int高,低;
发现=错误;
如果((int*)开始[计数位置]==0)
{
pos=0;
qDebug()名称、pos、查找、比较商品);
addtosort((((车间*)(开始))->次级、Pnew、pos);
}
//在第二级中查找要添加的项
无效查找位置(QString键)
{
int pos;
布尔发现;
整数计数=((整数*)开始)[计数位置];
for(int i=0;i子级、键、位置、查找、比较商店);
如果(查找)
{
货物*Pnew=新货物;
Pnew->date=“foo”
Pnew->name=“bar”
添加商品(((净*)(开始)[pos])->次级,Pnew);
打破
}
}
}

<>这会导致什么问题?

这是一个C代码,上面有几个C++的函数。(就像
new
,也在使用
Qt
。但是我不明白为什么OP会将其编码为
c
程序,因为使用了
Qt
@drescherjm,OP似乎在上课,这是一项任务。是的,我实际上是在用数据结构编写gui,我在大学里完成了这个任务,我没有T添加整个代码。也使用VoUL**代替适当类型的指针声音,这样C++就这样一个小C++。
// expand array if it overfilled
void ExpandArrPtr (void **&ar,  int &SizeAr, int Cnt)
{
    void **arW;
    arW = new void*[SizeAr+DELTA+2];

    for (int K = SizeAr-1; K >= 0; K--) {
        arW[K+2] = ar[K];
    }
    SizeAr = SizeAr + DELTA;
    ar=ar-2;

    delete []ar;
    ar=arW+2;

    ((int*)ar)[COUNT_POS]  = Cnt;
    ((int*)ar)[SIZE_POS]  = SizeAr;
}

// binary search

void bin_search(void **start, QString key, int &pos, bool &find, Cmpmethod func)
{
    int mid;
    int high, low;
    find = false;
    if((int*)start[COUNT_POS] == 0)
    {
        pos = 0;
        qDebug()<<"zero elem\n";
        return;
    }
    low = 0;
    high = ((int*)start)[COUNT_POS] - 1;
    do
    {
        mid = (high + low) / 2;
        int result = func(start[mid], key);
        if(result == 0)
        {
            pos = mid;
            find = true;
            return;
        }
        else if(result == 1)
        {
            high = mid - 1;
        }
        else
        {
            low = mid + 1;
        }
    }while(low <= high);

    pos = low;
}

// function for adding  in any level
void addtosort(void **&start, void *pnew, int pos)
{
    int count = ((int*)start)[COUNT_POS];
    int size = ((int*)start)[SIZE_POS];

    if(count == size)
    {
        ExpandArrPtr(start, size, count);
    }
    if(pos == count)
    {
        start[pos] = pnew;
    }
    else
    {
        for(int i = count;i >= pos;i--)
        {
            start[i+1] = start[i];
        }
        start[pos] = pnew;
    }

    count++;
    ((int*)start)[COUNT_POS] = count;
}

void add_goods(void **&Start, goods * Pnew)
{
    int pos;
    bool find;

    bin_search((((shop*)(Start))->sublevel), Pnew->name, pos, find, compare_goods);
    addtosort((((shop*)(Start))->sublevel), Pnew, pos);
}
// finding the item  in second level to add

void find_place(QString key)
{
    int pos;
    bool find;
    int count = ((int*)Start)[COUNT_POS];
    for(int i = 0;i < count;i++)
    {
        bin_search(((net*)(Start)[i])->sublevel, key, pos, find, compare_shop);
        if(find)
        {

            goods * Pnew = new goods;
            Pnew->date = "foo"
            Pnew->name = "bar"
            add_goods(((net*)(Start)[pos])->sublevel, Pnew);
            break;
        }
    }
}