【发布时间】:2018-01-13 14:47:13
【问题描述】:
我正在编写一个程序来发现从一个顶点到另一个顶点的最佳路径。好吧,我创建顶点,为邻居列表分配内存。当我在两个顶点之间创建连接时,我会重新分配列表的内存以向邻居列表中再添加一个顶点。它似乎在前两次有效,但在第三次它崩溃并给我信号“SIGABRT”。我在任何论坛中都找不到该问题的解决方案。这是我的代码:
typedef struct vertex{
char* name;
Vertex** neighbors;
float x, y;
}Vertex;
Vertex* create_vertex(char* name, float x, float y){
Vertex* vertex = (Vertex*) malloc(sizeof(Vertex));
vertex->x = x;
vertex->y = y;
vertex->name = (char*) malloc(sizeof(char)*strlen(name) + 1);
strcpy(vertex->name, name);
vertex->neighbors = (Vertex**) malloc(sizeof(Vertex*));
vertex->neighbors[0] = NULL;
return vertex;
}
void creates_connection(Vertex* v1, Vertex* v2){
if(areNeighbors(v1, v2)){
printf("Vertices ja sao vizinhos");
return;
}
Vertex** real;
if(v1->neighbors[0] == NULL){
real = (Vertex**) realloc(v1->neighbors, sizeof(Vertex*)+1);
if(real != NULL){
v1->neighbors = real;
v1->neighbors[0] = v2;
v1->neighbors[1] = NULL;
}else printf("Nao foi possivel realocar memoria");
}else{
Vertex* aux = v1->neighbors[0];
int i = 0;
while(aux != NULL){
aux = v1->neighbors[i];
i++;
}
real= (Vertex**) realloc(v1->neighbors, (sizeof(Vertex*))*(i+1));
if(real!= NULL){
v1->neighbors= real;
v1->neighbors[i] = v2;
v1->neighbors[i+1] = NULL;
}else printf("Nao foi possivel realocar memoria");
}
if(v2->neighbors[0] == NULL){
real = (Vertex**) realloc(v2->neighbors, sizeof(Vertex*));
if(real != NULL){
v2->neighbors = realocado;
v2->neighbors[0] = v1;
v2->neighbors[1] = NULL;
}
}else{
Vertex* aux = v2->neighbors[0];
int i = 0;
while(aux != NULL){
aux = v2->neighbors[i];
i++;
}
//HERE, BELLOW, IT CRASHES, DOESN'T PASS TO THE IF
real = (Vertex**) realloc(v2->neighbors, (sizeof(Vertex*))*(i+1));
if(real != NULL){
v2->neighbors = real;
v2->neighbors[i] = v1;
v2->neighbors[i+1] = NULL;
}else printf("Nao foi possivel realcoar memoria");
}
}
我不知道这是否是做我想做的事情的最佳方式,我接受建议,但我也想了解发生了什么,我的意思是,为什么会发生这个 SIGABRT。
【问题讨论】:
-
real = (Vertex**) realloc(v1->neighbors, sizeof(Vertex*)+1);应该是 -->>real = (Vertex**) realloc(v1->neighbors, sizeof(Vertex*)*2); -
Vertex是如何定义的? -
这肯定是错误的
realloc(v1->neighbors, sizeof(Vertex*)+1);通常看起来像realloc(v1->neighbors, (current_size+1) * sizeof(Vertex*));我也认为类型错误 -
顶点是一种抽象数据类型,它包含两个变量float和一个变量char*。我想我可以看到错误,“+1”只会在内存重新分配中添加一个字节,对吧?
-
@yamunaq - 是的,这肯定是一个错误。但我认为还有更多的问题。要获得帮助,请发布
Vertex的代码