2017-05-22 1 views
-2

나는 인수의 중복에 대해 알고 있습니다. 그 때문에, 양해 해 주셔서 진심으로 감사드립니다.실용적인 분할 코어 덤핑

나는 신중하게 thisthis과 같은 문제에 관해 많은 좋은 스레드를 읽었습니다. 나는 코어 덤핑 (core dumping)이 무엇인지를 개념적으로 분명히 하였지만 실제로 무엇이 무엇인지, 어떻게 감지하는지 알 수는 없다.

내가 일하고 다음 예제를 고려하십시오 : 그것은 확인하는 간단한 프로그램입니다 입력 문자열이 회문 인 경우 : "핵심 범프"

이 프로그램에 원인을 무엇
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#define SIZE 20 

int length(char s[SIZE]){ 
     int i; 
     while(s[i] != 0) 
       i++; 
     return i; 
} 

int main(){ 
     char s[SIZE], c; 
     int i = 0, j, flag = 1; 
     printf("\n\nGood morning, master. Tell me a word. I will check if it is a\n" 
       "palindrome\n\n"); 
     for(i = 0; (c = getchar()) != '\n'; ++i){ 
       s[i] = c; 
     } 
     j = length(s) - 1; 
     while(flag && i < j){ 
       flag = s[i] == s[j]; 
       i++; j--; 
     } 
     if(flag) 
       printf("\n\nSuccess!\n\n"); 
     return 0; 
} 

+0

의심을 코어 - 심지어 컴파일되지 않습니다 –

+0

'char c [SIZE];'---->'char s [SIZE]; char c;' – LPs

+0

실제로 내 컴퓨터에서 컴파일합니다 (lubuntu VM의 gcc 컴파일러). – Worice

답변

2

귀하의 길이 기능이있다 3 큰 문제 :

  1. 로컬 i
  2. 함수 MU 초기화되지 st i 값이 끝에옵니다.
  3. 당신은에 - 경계
    int length(char s[SIZE]){ 
         int i = 0; 
         while ((s[i] != 0) && (i<size-1)) 
           i++; 
        return i; 
    } 
    

    당신은 당신의 "문자 수집 루프"너무을 s 길이의주의를 기울여야한다

당신의 배열에 접근하기 위해 확인해야합니다. getchar에서 반환 할 수있는 EOF를 처리해야합니다. 예를 들어 CTRL + D (Linux에서는) 문자열을 종료해야합니다. C-Strings 있습니다 nul-terminated

for (i = 0; (((c = getchar()) != '\n') && (c!=EOF)&& (i<SIZE-2)); ++i) 
{ 
    s[i] = c; 
} 
s[i] = '\0'; 

마지막으로 ... 최종 루프는 입력 문자열에서이 개 같은 문자가있는 경우 반환 만에, 추측 무엇 않습니다 그 코드가 덤프

+0

코드별로 한 줄씩 코드를 작성하고 _all_ 가지의 실수를 설명 할 준비가되지 않은 경우에는 이와 같은 질문에 대답하지 마십시오. – zwol

+0

@zwol 대답을 업데이트하고 있는데, 뭔가 잊어 버렸습니까? – LPs

+0

"main"에 적어도 세 가지 버그가 있는데, 그 중 일부는 segfault를 일으킬 수 있습니다. 또한, "strlen'을 잘못 재 작성했습니다."length'의 문제로 언급해야합니다 ;-) – zwol

1

당신은 길이 기능에 i 초기화하지 않은, 그래서 그 가치는 유효하지 않은 메모리를 액세스 종료됩니다 SIZE보다 큰 경우 그 값은 세그먼트 오류로 이어지는 것도

될 수

+0

코드별로 줄을 서서 _all_ 실수를 설명 할 준비가되어 있지 않으면이 질문에 대답하지 마십시오. – zwol