2017-01-04 1 views
2

을 주석 후 잘 작동? 당신의 main 기능 내부C printf 함수를 추가 한 후 분할 오류가 발생했습니다. 나는 내가 먼저 밖으로의 printf, 그것은 요 괜찮을는 이런 일이 않는 작품을 언급 code.If의이 부분을 실행 한 후 세그먼트 오류를 ​​얻을 수

#include <stdio.h> 

int Func (int *a){ 
    printf("%d\n",56); 
    printf("a is %d\n",*a); 
    return 3; 
} 


int main(){ 
    int N, i, Planet, *a,junk; 

    junk=scanf("%d", &N); 
    *a = N; 
    Planet = Func(a); 
    printf("%d\n", Planet); 
    return 0 ; 
} 
+6

을 한 줄에 하나의 변수를 선언 할을 제안하고, NULL 포인터를 초기화하는 것입니다. unintialized 포인터 역 참조 (당신의'* A = N;'선 것은) 정의되지 않은 동작 – yano

+0

당신이 사용할 수있는 모든 경고와 함께 컴파일 시도 유무 : 그 경고 중 하나는 당신에게 당신의 세그멘트 폴트의 원인을 말할 것이다. – Evert

+0

은 * 아무 * 당신은 기본적으로 가리키는'INT *'라는'A'을 가지고, 조금 더 명확히 없습니다. 당신은'* A = N을 수행 할 때,'당신은 * 아무 * 위치로 이동하고, 그 자리에서 N''의 내용을 적어 컴퓨터를 말하는 것입니다. 이것은 segfault의 원인입니다. – turbulencetoo

답변

2

, 당신은 int *a 포인터 변수 정의 :

int main(){ 
    int N, i, Planet, *a,junk; 

을하지만 이전에 그것을 위해 메모리를 할당하지 않고 포인터를 역 참조,도 가리 키도록 설정

*a = N; 
의미있는 뭔가

이 정의되지 않은 동작이 발생합니다.

aN을 가리 킵니다.

a = &N; 

지금 당신이 N에 일부 콘텐츠를 작성하는 *a를 사용할 수 있습니다 그렇다면, 이것은 올바른 구문입니다.


P.S. 일반적으로 , 나는 : 예컨대, 당신은`INT * A`에 대한 공간을 할당하지 않을

int man() { 
    int *a = NULL; 
    ... 
+0

나는 그것을 얻었지만 첫 번째 printf를 주석 처리 한 후 왜 제대로 실행 되었습니까? – user7375077

+0

@ user7375077 : 생성 된 어셈블리를 검사하여 컴파일 된 코드가 실제로 무엇을했는지와 두 경우의 차이점을 파악할 수 있습니다. 초기화되지 않은'a'에 대한'* a = N'은 _undefined behavior_입니다 : 모든 것이 일어날 수 있습니다. –

관련 문제