2014-09-15 4 views
-2

프로그램이 금액을 요구를 (코어 덤프)과 난을 실행할 때의 세그먼트 오류 C 랭

#include <stdio.h> 
int main(void){ 



    int no500,no100,amount; 

    printf("please enter amount to withdraw :"); 
    scanf("%d",amount); 
    void function(int a,int*x, int*y){ 
    *x= a/500; 
    *y=(a%500)/100; 

} 
    function(amount,&no500,&no100); 
printf("the number of 500 bills %d\n ",no500); 
printf("the number of 100 bills %d\n ",no100); 


} 

만들어진 500 개 & 100 지폐의 수를 출력 얻을 :

금액을 입력하세요 철수 : 1500

분할 오류를

+2

'는 scanf ("% d 개", 양)해야

scanf("%d",amount); 

&을 놓친, '잘못,'scanf'을 사용하는 방법을 구글. –

+3

중첩 된 함수를 사용하지 마십시오. 일부 컴파일러에서는 확장 기능이며 표준이 아닙니다. –

+1

이 질문에 대한 답은 사용중인 초급 C 책의 1 장에서 다루고 있습니다. – Lundin

답변

7

scanf()는 매개 변수로 포인터를 기대 (코어 덤프). &주소 인amount이 아닌 값으로 전달되어야합니다.

scanf("%d", &amount); 

귀하의 프로그램은 amount을 (초기화되지 않은) 소요, 당신은 메모리 주소로 해석 그 값으로 입력 한 번호 기록 - 프로그램 충돌을 잘못된 접근입니다 .

옛날에는 "세그먼트"를 통해 메모리 보호가 이루어졌으며 잘못된 메모리 액세스로 인해 "세그먼트 오류"가 발생했습니다. 오류 메시지가 지속되었습니다. 코어 메모리 (즉, 현재 상태의 프로그램)의 내용이 디스크 ("core"라는 파일)에 덤프되었습니다. 이것은 디버깅에 사용될 수 있습니다. 이 덤핑은 선택 사항이며 (유닉스의 경우) ulimit -c을 통해 제어되므로, "(코어 덤프 된)"부분이없는 Segfault 이 표시 될 수 있습니다. 관련 컴파일러 경고를 활성화

amount의 uninitalized 사용에 대해 경고해야하고, scanf()에 대한 호출의 가능성도 유형 불일치 (그리고 "핵심 메모리는"그냥 "세그먼트 오류."와 같은 다른 시대 착오적이다).

또한, 당신은 있는지 실제로 성공하기 위해 scanf()의 반환 값을 확인해야합니다, 또는 amout여전히는 초기화되지 않은 것 (예를 들어, 사용자가 숫자 대신 문자를 입력 할 때).

0

당신은

scanf("%d", &amount); 
//----------^