为什么p->k访问会越界?

新手上路,请多包涵

我通过递归的形式将上一层的指针传给下一层,下一层在获取值时出现了越界的情况,下一层的p->k越界了,但是p->total_weight却可以正常访问到。求大神解答

void Enum_Tree_Create(GraphAdjoinList *G, int number, EnumTreeList *p){
    if(p->k==G->numNodes){
        if(p->total_weight<min){
            min = p->total_weight;
            arrayCopy(minPath, p->path, p->k);
        }
    }
    int i=0;
    for(EdgeNode *e = G->adjList[number].firstedge;e;e=e->next,i++){
        if(!visited(p, G->adjList[e->adjvex].data)){
            EnumTreeList *v = (EnumNode*)malloc(sizeof(EnumNode));
            arrayCopy(v->path, p->path, p->k);
            v->path[p->k++] =  G->adjList[e->adjvex].data;
            v->total_weight = p->total_weight + e->weight;
            p->child[i] = v;
            Enum_Tree_Create(G, e->adjvex, p->child[i]);
        }
    }
}
阅读 1.4k
1 个回答

看了下你的代码,p是一个指向EnumTreeList结构体的指针,而最后一行的Enum_Tree_Create(G, e->adjvex, p->child[i]);,你将p的某个子节点的指针作为参数传递给了Enum_Tree_Create函数。这意味着在递归的下一层调用中,p指向的是原始的EnumTreeList结构体,而不是原始的子节点。在这种情况下,如果你在下一层中使用p->k来访问某个子节点的成员变量,因为这个子节点的内存布局可能与EnumTreeList结构体的内存布局不同,p->k访问可能越界。
因此,改下递归的指向p->k就可以解决:

void Enum_Tree_Create(GraphAdjoinList *G, int number, EnumTreeList *p){
    if(p->k==G->numNodes){
        if(p->total_weight<min){
            min = p->total_weight;
            arrayCopy(minPath, p->path, p->k);
        }
    }
    int i=0;
    for(EdgeNode *e = G->adjList[number].firstedge;e;e=e->next,i++){
        if(!visited(p, G->adjList[e->adjvex].data)){
            EnumTreeList *v = (EnumNode*)malloc(sizeof(EnumNode));
            arrayCopy(v->path, p->path, p->k);
            v->path[p->k++] =  G->adjList[e->adjvex].data;
            v->total_weight = p->total_weight + e->weight;
            p->child[i] = v;
            Enum_Tree_Create(G, e->adjvex, v); // 将v作为参数传递
        }
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题