首页 > 解决方案 > 结构元素的初始化

问题描述

在下面的函数中,我为一个结构分配空间并将其分配给一个名为enlace

void insertar_enlace_entre_nodos(nodo_t *nodo1, nodo_t *nodo2, char *de_nombre_if, char *a_nombre_if, unsigned int costo) {
    int ranura1 = obtener_ranura_intf_disp(nodo1);
    int ranura2 = obtener_ranura_intf_disp(nodo2);

    if(ranura1 != -1 && ranura2 != -1) {
        enlace_t *enlace = calloc(1, sizeof(enlace_t));
        inicializar_interface(&enlace->intf1);
        inicializar_interface(&enlace->intf2);
        strncpy(enlace->intf1.nombre_if, de_nombre_if, TAM_NOMBRE_IF);
        enlace->intf1.nombre_if[TAM_NOMBRE_IF - 1] = '\0';
        strncpy(enlace->intf2.nombre_if, a_nombre_if, TAM_NOMBRE_IF);
        enlace->intf2.nombre_if[TAM_NOMBRE_IF - 1] = '\0';

        enlace->intf1.enlace = enlace;
        enlace->intf2.enlace = enlace;
        
        enlace->intf1.nodo_padre = nodo1;
        enlace->intf2.nodo_padre = nodo2;
        nodo1->intf[ranura1] = &(enlace->intf1);
        nodo2->intf[ranura2] = &(enlace->intf2);

        init_prop_intf(enlace->intf1.prop_intf);
        init_prop_intf(enlace->intf2.prop_intf);

        enlace->costo = costo;
    }
}

这些是我使用的结构

typedef struct enlace_ enlace_t;

struct enlace_ {
    interface_t intf1;
    interface_t intf2;
    unsigned int costo;
};

typedef struct interface_ {
    char nombre_if[TAM_NOMBRE_IF];
    struct nodo_ *nodo_padre;
    struct enlace_ *enlace;
    prop_intf_t *prop_intf;
} interface_t;

typedef struct prop_intf_ {
    bool tiene_dir_ip;
    dir_ip_t dir_ip;
    dir_mac_t dir_mac;
    char mascara;
} prop_intf_t;

即使很难我没有初始化任何元素intf1,我可以修改nombre_if并且我没有收到任何错误

strncpy(enlace->intf1.nombre_if, de_nombre_if, TAM_NOMBRE_IF);

但是当我到达这个其他功能时,调试器向我显示了一个分段错误错误并且程序结束了。它发生在第一条指令时。

static inline void init_prop_intf(prop_intf_t *prop_intf) {
    prop_intf->tiene_dir_ip = false;
    prop_intf->mascara = 0;
    memset(prop_intf->dir_ip.dir_ip, 0, 16);
    memset(prop_intf->dir_mac.dir_mac, 0, 6);
}

错误消息是程序收到信号 SIGSEGV,分段错误。0x0000555555555277 init_prop_intf (prop_intf=0x0) at ../src/Net.h:40 40 prop_intf->tiene_dir_ip = false; 程序因信号 SIGSEGV、分段错误而终止。该程序不再存在。

所以我想知道为什么在第一种情况下没有任何问题,而在第二种情况下它确实出现了问题,以及何时必须初始化结构的元素。

标签: cstructsegmentation-faultboolean

解决方案


推荐阅读