2014-02-10 2 views
0

포인터를 값으로 인쇄하려고 합니다만, 작업을 중단합니다 (MinGW의 오류 보고서 없음). . .C의 포인터 함수가 작동하지 않습니다.

#include<stdio.h> 

    void point_here(int *yolo) { 
     int you = 2014; 
     yolo = &you; 

    } 


    main() { 
     int *punk = NULL; 

     point_here(punk); 
     printf("Punk @ %d is not dead\w/.\n", *punk); 

    } 

어떻게하면됩니까? 왜 이것이 작동하지 않습니까? 설명 해주십시오. 나는 포인터와 C에 익숙하지 않고, 물건을 읽은 후에도 여전히 혼란 스럽다.

답변

0

C는 "값으로 호출"입니다. 함수는 참조가 아닌 호출자 값의 사본을 가져옵니다. 함수 내부에서 인수를 변경하면 호출자의 컨텍스트에서 아무 일도 일어나지 않습니다.

이 문제를 해결하려면 명시 적 포인터가 필요하지만 함수 내부에서 로컬 변수에 대한 포인터를 가질 수는 없습니다.

+0

그러나 여전히 함수 내에서 지역 변수에 대한 포인터를 가질 수는 없지만 해당 함수를 실행하는 것 이상으로 지속됩니다 ._ 선생님 사면? – user3203014

+0

@ user3203014 그는'point_here'가 반환 한 후에 기본적으로 사라진 변수'you'를 의미합니다. –

0

사실상 아무 것도하지 않는 함수에 인수로 NULL을 전달합니다. 그런 다음 불법 인 NULL 포인터를 역 참조하려고합니다.

-1

두 가지 문제가 있습니다. 먼저 포인터 변수는 값으로 전달되고, 두 번째 변수는 "you"가 스택에있는 경우 함수가 반환되면 손실됩니다.

변경 변수는이

static int you = 2014; 

같은 정적 ** 욜로의 인수를 변경;

+0

질문 1 : "먼저 포인터 변수가 값으로 전달됩니다 ..." "* yolo"또는 "* punk?"포인터를 참조합니까? 질문 2 : "** yolo"는 이중 포인터입니다. 맞습니까? 이중 포인터를 사용해야하는 이유는 무엇입니까? 내가 * yolo의 가치를 이미 "int you"에 할당했기 때문입니까? 죄송합니다. 아직 아래 설명을 듣지 못했습니다. – user3203014

+0

질문 1 : 포인터 변수 punk가 yolo 인 새 변수에 복사됩니다. 그 이유는 펑크가 함수 호출에서 결코 변경되지 않는다는 것입니다. 질문 2 : 이중 포인터는 포인터 변수에 대한 포인터를 의미하므로 포인터 변수가 변경되었습니다. –

0

코드의이 수정 된 버전은 잘 작동 :

#include <stdio.h> 

void point_here(int *yolo) { 
    *yolo = 2014; 
} 

int main() { 
    int value = 0; 
    int *punk = &value; 
    point_here(punk); 
    printf("Punk @ %d is not dead\w/.\n", *punk); 
    return 0; 
} 

다른 사람이 말했듯이, 다음과 같은 문제가 있습니다 : 함수 값

  • 포인터 기능 완료된 후 작동하지 않습니다 실행 중
  • 포인터 값을 전달중인 포인터에 포인터를 전달하지 않습니다. (즉, 당신이 생각하는 것을 편집하는 것이 아닙니다.)

이미 할당 된 포인터를 전달하여이 두 가지 문제를 해결 한 다음 함수에서 수정합니다. 이것은 포인터를 사용하는 한 가지 표준 방법입니다. 행운을 빌어 요!

+0

왜 _ _ punk_를 _ & value_ (0)에 할당해야하며 NULL에 직접 할당하는 것이 아닙니까? 그런 다음 _point_here_의 매개 변수를 _ * yolo_ (왜 _ * x_를 제거해야하는 이유)로 변경해야하나요? – user3203014

+0

공간을 할당하는 데는 여러 가지 방법이 있습니다. 가장 간단한 방법은 변수를 선언하고 그 변수에 메모리를 할당하는 것입니다."int 값"을 만드는 것이 당신에게 도움이됩니다. 또 다른 방법은 "malloc"을 사용하는 것입니다. 이 코드는 다음과 같다.'int * punk = (int *) malloc (1 * sizeof (int));' –