falla de segmentación (volcado de núcleo)

Recibo un error de segmentación (volcado de memoria) cuando bash ejecutar esto. Se comstack perfectamente pero me sale el error, y no sé por qué. He intentado editar mi código de todas las formas posibles, pero sigo recibiendo este error. Ya no tengo ideas. Cualquier ayuda sería genial. ¡Gracias!

unsigned short *reg = NULL; int byte; int i; for (byte = 0; byte < num_bytes; byte++){ unsigned int next_byte = (unsigned int) message[byte]; crc_byte(reg, key, next_byte); } for (i = 0; i < 16; i++){ crc_bit(reg, key, 0); } return *reg; } 

Para mí, su problema de falla de segmentación proviene del puntero de registro que es NULL. Esto significa que modificará un valor de hsort no localizado ubicado en la dirección cero. En la mayoría de los sistemas operativos, esto no está permitido.

¿Por qué no haces lo siguiente?

 unsigned short crc_message(unsigned int key, char *message, int num_bytes) { unsigned short reg; int byte; int i; for (byte = 0; byte < num_bytes; byte++){ unsigned int next_byte = (unsigned int) message[byte]; crc_byte(&reg, key, next_byte); } for (i = 0; i < 16; i++){ crc_bit(&reg, key, 0); } return reg; 

}

Comstackr con información de depuración:

 > gcc -o myprog myprog.c -ggdb 

Ejecutar en un depurador

 > gdb myprog (gdb) run 

El depurador le dice dónde ocurrió la falla de seguridad:

 Program received signal SIGSEGV, Segmentation fault. 0x0040133d in crc_bit (reg=0x0, key=12345, next_bit=0) at rrr.c:4 4 unsigned int msb = (*reg >> (sizeof(*reg)-1)) & 1; 

Tenga en cuenta que reg es 0 (es decir, NULL) y no lo hace.

Estás pasando un reg NULL a crc_byte() , que lo pasa a crc_bit() , que luego intenta desreferenciarlo.

Cambia la función así:

 unsigned short reg = 0; /* replace 0 with whatever value is appropriate */ ... for (byte = 0; byte < num_bytes; byte++){ ... crc_byte(&reg, key, next_byte); /* added the ampersand */ } for (i = 0; i < 16; i++){ crc_bit(&reg, key, 0); /* added the ampersand */ } return reg; /* removed the asterisk */ 

reg es NULL en crc_message . Esto se pasa a crc_byte y se pasa a crc_bit . Luego use acceso a una ubicación que tiene una dirección NULL .