2012-05-26 4 views
2

함수 (log_msg_send)가 호출 될 때 아래 코드의 런타임에 SIGSEGV - Segmentation Fault가 발생합니다. 나는 그것이 메모리 위반에 관한 것이지만 이유를 찾을 수 없다는 것을 읽었다. 나는 어떤 제안이나 도움을 주셔서 감사합니다.C에서의 SIGSEGV (Segmentation Fault)

#define MAXSTRINGLENGTH 128 
#define BUFSIZE 512 

void log_msg_send(char *message, char *next_hop); 

struct routing { 
     int hop_distance; 
     char sender_ID[16]; 
}; 

struct routing user_list[40] = { [0]={0,0,0,0}}; 


int main(int argc,char *argv[]){ 
    strcpy(user_list[0].sender_ID,"192.168.001.102"); 
    char message[1000]; 
    strcpy(message,"123456123456"); 
    log_msg_send(message, user_list[0].sender_ID); 

    return 0; 
} 

void log_msg_send(char *message, char *next_hop){ 
    char *SRV_IP; 
    strcpy(SRV_IP, next_hop); 

    if (sizeof(SRV_IP) == 16){ 
     struct sockaddr_in si_other; 
     int s, i, slen=sizeof(si_other); 
     char buf[60] ; 
     strcpy(buf, message); 

     if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1){ 
      fprintf(stderr, "socket() failed \n"); 
      exit(1); 
     } 

     memset((char *) &si_other, 0, sizeof(si_other)); 
     si_other.sin_family = AF_INET; 
     si_other.sin_port = htons(33333); 
     if (inet_aton(SRV_IP, &si_other.sin_addr) == 0) { 
      fprintf(stderr, "inet_aton() failed \n"); 
      exit(1); 
     } 

      if (sendto(s, buf, BUFSIZE, 0,(struct sockaddr *) &si_other, slen)==-1){ 
      fprintf(stderr, "sendto() failed \n"); 
      exit(1); 
     } 

     close(s); 
    } 
} 

ps. SIGSEGV 문제가있는 사람들에게. 대부분 common reasons for SIGSEV 문제 : - 올바르게 컴파일되지 않는 프로그램을 실행하려고 시도합니다. 대부분의 컴파일러는 컴파일 타임 오류가 주어지면 바이너리를 출력하지 않습니다. - 버퍼 오버 플로우. - 초기화되지 않은 포인터 사용. - NULL 포인터를 역 참조. - 프로그램이 소유하지 않은 메모리에 액세스하려고 시도합니다. - 프로그램이 소유하지 않은 메모리를 변경하려고합니다 (저장 장치 위반). - SRV_IP

char *SRV_IP; 
strcpy(SRV_IP, next_hop); 

그래서 strcpy 시도에 대한 (아마도 인해 가출 재귀 또는 무한 루프) 허용 스택 크기

+1

"valgrind"를 사용하면 이러한 종류의 문제를 쉽게 해결할 수 있습니다. 프로그램을 설치하고 정상적으로 실행하지만 명령 행에서 프로그램 이름 앞에 valgrind를 넣으십시오. 그런 다음 오류를 감지하고 메시지를 인쇄합니다. –

+0

이 코드가 작동하지 않는 이유는 무엇입니까? –

답변

4

당신은 메모리 할당하지를 초과하는 잘못된 메모리에 액세스 할 수 있습니다.

char *SRV_IP = malloc(strlen(next_hop)+1); 
if (!SRV_IP) exit(1); 
strcpy(SRV_IP, next_hop); 

은 그럼 당신은 그 크기가 보통 char 포인터가 어떤 크기 8 또는 4 바이트 그래서

if (sizeof(SRV_IP) == 16){ 

하지만 SRV_IP가하는 char*입니다 확인. 아마도 길이를 의미 했으므로 strlen을 사용해야합니다.

+0

명확한 설명을 해주셔서 대단히 감사합니다. – johan

+1

어쩌면이 내용을 추가하려고하는데, 'sizeof'는'strlen'이어야합니다. –

+0

@ 앤드류 쿠크, 감사합니다 – johan

관련 문제