2014-03-04 2 views
0

나는 youtube에서 운동을했는데 그가 가지고있는 것과 같은 해결책으로 끝났지 만 그의 코드는 포인터가 가리키고있는 주소를 얻을 수 있었지만 광산을 컴파일하고 실행할 때 오류 세그먼테이션 오류 (코어 덤프), 나는 어떻게해서든지 내가 접근해야하는 것이 아닌 메모리에 접근하고 있는가? 그의 코드는 어떻게 실행되었지만 내 코드는 실행되지 않았는가? printf ("num의 주소는 % d \ n", * ptr)에 문제가 있다는 것을 알고 있습니다. 하지만 YouTube에서 라인 작업을했지만 내 컴파일러에서 않습니다.분할 (코어 덤프)이 왜 발생합니까?

#include <stdio.h> 

int print_int_ptr(); 

int main(){ 
    int num; 

    num = 10; 
    print_int_ptr(num); 


    return(0); 
} 
/* dont forget that in between the assignment of ptr = &num */ 

/* Take the address of an integer as a parameter, and print out both the 
    * address and the integer itself 
    */ 
    void print_int_ptr(int *ptr){ 

    printf("The address of num is %d\n", *ptr); 
    printf("The value of num is %d\n", ptr); 
    } 
+1

이 문제를 확인하기 위해 경고가 켜진 상태로 프로그램을 컴파일하십시오. –

답변

2

main()에서 num은 정수입니다. 이 번호를 print_int_ptr(int *ptr)으로 전달합니다.

int *ptrprint_int_ptr()의 첫 번째 인수가 포인터임을 나타냅니다. int *은 포인터를 선언하기 때문입니다. 따라서 print_int_ptr()을 입력하면 ptr이 포인터로 간주됩니다. 그러나 num = 10이므로 ptr에 대한 참조는 10 번을 가리키며 분명히 옳지 않습니다.

정확하게 당신이 printf("The address of num is %d\n", *ptr);으로하고있는 것입니다. *ptr 포인터를 역 참조하면 주소 10에있는 값에 액세스하려고 시도합니다. 그러나 운이 좋으면 OS가이 프로세스를 정확하게 알려주지 않는 한 임의의 주소에서 값에 액세스 할 수 없습니다.

+0

설명해 주셔서 감사합니다. – mvitagames

0

귀하의 기능은 포인터 int *을 사용하고 있습니다.

따라서 전화 번호는 print_int_ptr(&num);으로 바꿉니다.

그리고 printf("The value of num is %d\n", ptr);printf("The value of num is %d\n", *ptr);으로 바꿉니다.

또한 printf의 주소 값을 인쇄하려면 %d%p으로 바꿉니다.

+0

.................? –

1

num을 정수로 선언했으며 print_int_ptr 함수에 매개 변수로 넣었습니다. print_int_ptr 함수를 선언했을 때 잘못 선언했다고 생각합니다. int이어야합니다 ptr?

그리고 값을 반환하지 않으면 print_int_ptr 함수를 int가 아닌 void로 선언해야합니다.

+0

그래,하지만 난 print_int_ptr의 매개 변수가 어떻게 잘못 보지 않니? 내가 풀려고했던 질문은 print_int_ptr이라는 함수를 만들었습니다.이 함수는 하나의 매개 변수 인 정수를 가리키는 포인터와 정수와 그 주소를 출력합니다. – mvitagames

+0

너의 num = 10 후에 좋다. print_int_ptr (&num);)의 다음 줄을 함수에 num의 주소를 전달하여 –

+0

아래의 print_int_ptr 함수에 선언 된 ptr에 할당 할 수 있도록하십시오. 이제는 u가 매개 변수로 사용할 정수를 넣고 있습니다. 그것을 UR 주소 인 –