在以下函数中,我为结构分配空间并将其分配给名为 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 in init_prop_intf (prop_intf=0x0) at ../src/Net.h:40 40 prop_intf->tiene_dir_ip = false; 程序因信号 SIGSEGV,分段错误而终止。 该程序不再存在。
所以我想知道为什么在第一种情况下没有任何问题,而在第二种情况下会出现问题以及何时必须初始化结构的元素。