繁体   English   中英

分段故障(核心转储)

[英]segmentation fault (core dump)

当我尝试运行它时出现分段错误(核心转储)。 它可以完美地编译,但是出现错误,我也不知道为什么。 我试图以所有可能的方式编辑代码,但仍然收到此错误。 我已经没有主意了。 任何帮助都会很棒。 谢谢!

    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;
}

编译调试信息:

> gcc -o myprog myprog.c -ggdb

在调试器中运行

> gdb myprog
(gdb) run

调试器告诉您段发生在哪里:

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;

请注意,reg为0(即NULL),您可以取消引用它。

你传递一个NULL regcrc_byte()它通过它来crc_bit()然后试图取消对它的引用。

像这样更改功能:

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 */

regcrc_messageNULL 这将传递到crc_byte ,然后传递到crc_bit 然后使用访问地址为NULL的位置。

对我来说,您的分段错误问题来自REG指针,该指针为NULL。 这意味着您将修改位于地址零的未识别的hsort值。 在大多数操作系统上,这是不允许的。

你为什么不做以下事情?

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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM