2017-02-14 3 views
0

C에서 내 대학 과정에 대해 몇 가지 연습을하고 있는데 사용자가 선택 사항 (1 또는 2)을 입력 한 후 Segmentation fault (코어가 덤프 됨)와 함께 종료되는 다음 코드가 있습니다. 내가 우분투 16.04를 사용하고 있고 으로 내 소스 코드 파일을 컴파일하는 데 문제가 있는지 알 수 없다. 명령을 사용한다. 오와 내장 된 C 함수 strcpy와이 연습은 "우리에게 가르쳐하도록되어 있기 때문에 '어떻게 우리 자신의 문자열 사본을 만들기 위해 사용하는 것이 좋습니다하지 마십시오. 그래서오류 분할 오류 (코어 덤프)

내가 잘못 뭐하는 거지?

#include <stdio.h> 
#define SIZE 1000 

char mystrcpy(char *dest,char *src); 

main(){ 

    char str1[SIZE]; 
    char str2[SIZE]; 
    char str3[SIZE]; 
    int choice; 



    printf("Give first string: "); 
    gets(str1); 
    printf("Give second string: "); 
    gets(str2); 
    printf("Choose one of two strings (1 h 2): "); 
    scanf("%d",&choice); 

    if (choice==1) 
     mystrcpy(str3,str1); 
    else (choice==2) 
     mystrcpy(str3,str2); 

    printf("\nFirst string is %s\n",str1); 
    printf("\Second string is %s\n",str2); 
    printf("\nThrid string is %s\n",str3); 

} 


char mystrcpy(char *dest,char *src){ 
    int i; 

    while(1) 
    { 

     dest[i] = src[i]; 
     if (src[i] == '\0') 
      break; 

     i++; 
    } 

    return dest; 
} 
+3

모든 경고 및 디버그 정보 ('gcc -Wall -Wextra -g')로 컴파일하십시오. 코드를 개선하여 경고가 표시되지 않도록하십시오. 그런 다음 ** 디버거를 사용하십시오 ** ('gdb') –

+2

^^^ Basile이 말한 바입니다. 그것은 또한'else (choice == 2)'가 전혀 의미가 없다는 경고를 줄 것입니다. (그것이 세그 폴트의 원인은 아니지만) –

+0

고마워요! 그거였다! 나는 이것을 튜토리얼의 일부로보고 있었다. 그 녀석은 결코 초기화되지 않았어. Whatevs! 다시 한 번 감사드립니다! –

답변

2

을 (... 30 자 필요). 라이트, 차량 신호 조명을 가능하게하는 것이

공지 사항 ngs는이 간단한 경우에이 문제를 즉시 나타 냈을 것입니다. 디버거를 사용하는보다 복잡한 시나리오에서는 충돌이 발생한 시점의 i 값이 완전히 무의미하다는 것을 알았을 것입니다.

4

i가 초기화되지 않습니다.이 불확정 값에서 시작하므로, 따라서 세그먼트 폴트를 당신은 i를 초기화하지 않는