2014-02-10 4 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

세그먼트 결함 문제는 NULL 인 reg 포인터에서 발생합니다. 이것은 주소 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

당신은 다음 역 참조하려고 crc_bit(),에 전달하는 crc_byte()NULLreg을 전달하고 있습니다.

은과 같이 기능을 변경

:

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_message에서 NULL입니다. 이 메시지는 crc_byte으로 전달되어 crc_bit으로 전달됩니다. 그런 다음 주소가 NULL 인 위치에 액세스하십시오. 디버깅 정보와

4

컴파일 다음 세그먼트 폴트가 발생한 디버거

> gdb myprog 
(gdb) run 

디버거의

> gcc -o myprog myprog.c -ggdb 

실행을 알려줍니다 : 등록 번호가 0

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; 

하는 것으로 (즉, NULL) 그리고 당신은 역 참조.

관련 문제