2014-02-10 64 views
1

我在嘗試運行此操作時遇到了分段錯誤(核心轉儲)。它編譯完美,但我得到的錯誤,我不知道爲什麼。我試圖以各種可能的方式編輯我的代碼,但仍然收到此錯誤。我已經沒有想法了。任何幫助都會很棒。謝謝!分段錯誤(核心轉儲)

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

請看看這個:http://stackoverflow.com/questions/5115613/core-dump-file-analysis – Axel

回答

0

對我來說,你的分段故障問題來自於空指針。 這意味着您將修改位於地址零的unisgned 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; 

}

2

你傳遞一個NULLregcrc_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 */ 
+0

感謝,這爲我工作! – user3291818

0

regcrc_messageNULL。這被傳遞到crc_byte,它被傳遞到crc_bit。然後使用訪問地址爲NULL的位置。

4

編譯與調試信息:

> 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),並將其解除引用。