C: Значение переменной меняется без переназначения

Я реализую алгоритм Крускала.

После того, как я вызову graph() в следующем коде, значение узлов изменится. Я не совсем уверен, почему - если бы кто-нибудь мог это прояснить, я был бы очень признателен. Я не обращаюсь к значению узлов из графа, и оба узла и ребра, к которым обращается массив, расположены вне стека!

struct node {
  int parent, rank;
};
typedef struct node node;

struct edge {
  int fromvertex, tovertex;
  float weight;
};
typedef struct edge edge;

node* nodes;
edge* edges;

typedef enum {Unvisited, Visited} vertexstate;

int main (int argc, char const *argv[])
{
  void getcount(int*, int*);
  void graph(int, int);
  void makeset(int);
  int hasspantree(int, int, int);
  void kruskal(int, int);
  int printmcst(int);
  int nodecount, edgecount, i, totalcost=0;
  getcount(&nodecount, &edgecount);
  for (i = 1; i <= nodecount; i++)
    makeset(i);
  printf("%d \t %d\n", nodes[6].parent, nodes[6].rank );
  graph(nodecount, edgecount);
  printf("%d \t %d\n", nodes[6].parent, nodes[6].rank );
  printf("Has a spanning tree?");
  if(hasspantree(1, nodecount, edgecount)) {
    printf("\t Yes.\n");
    kruskal(nodecount, edgecount);
    printf("MCST found:\n\n");
    totalcost = printmcst(nodecount);
    printf("\nCost: %d", totalcost);
  }
  else {
    printf("No.");
    exit(0);
  }
  return 0;
}

void graph(int nodecount, int edgecount)
{
  for (int i = 0; i < edgecount; i++) {
    scanf("%d", &edges[i].fromvertex);
    scanf("%d", &edges[i].tovertex);
    scanf("%f", &edges[i].weight);
  }
}

void getcount(int *nodecount, int *edgecount)
{
  scanf("%d", nodecount);
  scanf("%d", edgecount);
  nodes = malloc(*nodecount * sizeof(node));
  edges = malloc(*edgecount * sizeof(edge));
}

void makeset(int x)
{
  nodes[x].parent = x;
  nodes[x].rank = 0;
}

1 ответ

Решение

Очевидной ошибкой является доступ к массиву узлов, начиная с индекса 1 вместо 0, и это приведет к переполнению буфера при доступе к последнему элементу

 for (i = 1; i <= nodecount; i++)  <-- here i should start at 0 and access only up to nodecount-1
    makeset(i);
Другие вопросы по тегам