проблема со ссылкой на узлы в матрице

#c #pointers #reference #null

#c #указатели #ссылка #null

Вопрос:

я попытаюсь объяснить весь код, который я помещу в следующие части, сначала я расскажу вам о проблеме, я теряю ссылку на указатель в этой матрице, которая соединяет один узел с ее соседом, я отправил вам printf, чтобы помочь увидеть, какие потерянныеиз ссылки, которую я имею, теперь программа, которую я пытаюсь создать, представляет собой матрицу, содержащую узлы, у которых в его атрибуте был сосед вверх, вниз, влево, вправо, и я пытаюсь предотвратить краевой случай, помещающий нулевые указатели в атрибут neighbor, но я не знаю, почему не работает правильно, потому что значение null внезапно меняется на 1, и я действительно не знаю, почему. вот код: (это меньший код, который я мог бы сделать для отображения ошибки)

 #include <stdio.h>
#include <unistd.h>
#include <string.h>

typedef struct Node
{
    int id;  
    int col;
    int row;
    int node_restricted; 
    struct Node* up;
    struct Node* down;
    struct Node* left;
    struct Node* right;
    int color;

}Node;
Node init_node(int id,int col, int row){
    Node new_node;
    new_node.id=id;
    new_node.col = col;
    new_node.row = row;
    new_node.up = NULL;
    new_node.down = NULL;
    new_node.left = NULL;
    new_node.right = NULL;
    new_node.color = 0;
    new_node.node_restricted = 0;

    return new_node;
}
Node** form_matrix_with_node(int amount_of_node_axis_x,int amount_of_node_axis_y){

    Node** matrix_with_node = calloc(amount_of_node_axis_x,sizeof(Node*));

    for (int i = 0; i < amount_of_node_axis_x; i  )
    {
        matrix_with_node[i] = calloc(amount_of_node_axis_y,sizeof(Node));
    }
    
    
    int total_of_node = amount_of_node_axis_x*amount_of_node_axis_y;
    int row = 0;
    int col = 0;
    for (int i = 0; i < total_of_node; i  )
    {
        if (((col 1)%amount_of_node_axis_x)==0)
        {
            matrix_with_node[row][col] = init_node(i,row,col);
            row = row   1; 
            col = 0;
        }else{
            matrix_with_node[row][col] = init_node(i,row,col);
            col = col   1;    
        }
        
    }
    
    link_between_node(matrix_with_node,amount_of_node_axis_x,amount_of_node_axis_y);
    matrix_with_node[0][0].color = 1;
    matrix_with_node[0][2].color = 1;
    matrix_with_node[0][3].color = 1;
    printf("this is my left pointer  %dn",matrix_with_node[1][0].left);
    matrix_with_node[0][4].color = 1;
    printf("this is my left pointer  %dn",matrix_with_node[1][0].left);
    matrix_with_node[1][0].color = 1;
    matrix_with_node[1][1].color = 1;
    matrix_with_node[1][2].color = 1;
    matrix_with_node[2][0].color = 1;
    matrix_with_node[3][0].color = 2; 
    
    
    

    
    return matrix_with_node;
}

void link_between_node(Node** matrix_with_node,int amount_of_node_axis_x,int amount_of_node_axis_y){
    
    for (int i = 0; i < amount_of_node_axis_x; i  )
    {
        for (int j = 0; j < amount_of_node_axis_y; j  )
        {            
            //en el siguente se ve si la conexion con el nodo de arriba
            if ((i-1)>=0)
            {            
                matrix_with_node[i][j].up = amp;(matrix_with_node[i-1][j]);
            }//en el siguente se ve si la conexion con el nodo de abajo
            if ((i 1)<amount_of_node_axis_y)
            {                
                matrix_with_node[i][j].down = amp;(matrix_with_node[i 1][j]);
            }//en el siguente se ve si la conexion con el nodo de izquierda
            if ((j-1)>=0)
            {                
                matrix_with_node[i][j].left = amp;(matrix_with_node[i][j-1]);
            }//en el siguente se ve si la conexion con el nodo de derecha
            if ((j 1)<amount_of_node_axis_x)
            {
                matrix_with_node[i][j].right = amp;(matrix_with_node[i][j 1]);
            }
        }      
    }
}
int main(int argc, char** argv)
{
    form_matrix_with_node(4,4);
}
  

Комментарии:

1. Одна из проблем заключается в том, что если вы выделяете 4 элемента, вы не можете назначить элемент с индексом 4. т. Е. matrix_with_node[0][4].color = 1; Требуется не менее 5 элементов.

2. Если у вас так много указателей в вашей структуре узла, может быть, вам не понадобится матрица?

3. wildplasser да, я знаю, но нужна матрица, чтобы сделать указатель: D

4. спасибо EdmCoff, это была проблема, я не видел, чтобы матрица была меньше: D