2014-10-18 4 views
0
#include<stdio.h> 

int main() 
{ 
    int z; int **x; int *y; 
    x = (int **) malloc(sizeof(int*)); 
    *x = malloc(sizeof(int)); 
    **x = 5; 
    y = *x; //POINT 1 
    z = 3; 
    *x = &z;//POINT 2 
    printf("%d\n",*y); 
    printf("%d\n", **x); 
    **x = 2; 
    printf("%d\n",*y); 
    *y=1; 
    printf("%d\n",z); 
} 

출력은?예기치 않은 출력 내가 얻을

3

5

2

내 질문은해야하지 첫 번째 출력 인쇄 3? 5가 인쇄되는 이유는 무엇입니까?

내 질문에이 프로그램은 매달려있는 참조 또는 가비지를 생성합니까? 나는 그것이이 예상치 못한 결과의 원인 중 하나라고 생각합니다. 누군가 설명해 주시겠습니까?

+0

들여 쓰기 코드 – Soren

+0

아니, 당신의 프로그램은 단순히 메모리 누수,하지만 할당되지 않은 메모리에 기록하지 않습니다 않으며 허상 포인터 결과 않습니다. –

+0

또한 왜 처음에는'3'을 인쇄해야하는지 알지 못합니다. ** 포인터가 무엇인지 ** 생각해야합니다. 포인터는 메모리 자체에 저장됩니다. 그것들은 가리키고있는 객체들처럼 복사되고 전달 될 수 있습니다 (이 경우'int'). 또한 포인터 **는 참조가 아니라는 것을 이해해야합니다.** –

답변

4

밖으로 끌어 내십시오.

 
+---+  +----+  +---+ 
| x | --> | *x | --> | 5 | 
+---+  +----+  +---+ 

다음은 지정 y :

x, *x**x를 초기화 한 후 메모리는 다음과 같이 보입니다

 
+---+  +----+ 
| x | --> | *x | --\ 
+---+  +----+ \  +---+ 
        >--> | 5 | 
      +---+ / +---+ 
      | y | --/ 
      +---+ 

을 그리고 당신은 그래서 당신은, 다른 곳 *x 점을 이 :

 
+---+  +----+  +---+ 
| x | --> | *x | --> | z | 
+---+  +----+  +---+ 

+---+  +---+ 
| y | --> | 5 | 
+---+  +---+ 

다른 말로하면 *x이 가리키는 곳을 y으로 가리키고, *x을 가리 키지 않으므로 *x이 변경되면 y이 가리키는 곳을 변경하지 마십시오.

+0

포인터를 그리는 것은 그것을 이해하는 가장 좋은 방법입니다. +1 –

+0

내 프로그램에서 매달린 참조 또는 가비지 값을 생성합니까? – user1010101

+0

@ user2733436 아니요, 매달려있는 포인터 나 쓰레기 값이 없습니다. –

1

x은 메모리 위치를 가리키는 포인터 (예 : p)를 가리 킵니다. 해당 위치에 5 값을 저장했습니다.
y은 포인터 p이 가리키는 위치를 가리키며 값이 5 인 위치를 가리 킵니다.
z은 값이 3 인 메모리 위치입니다.

이제 pz의 메모리 위치를 가리 키도록 만들어집니다. 그러나이 이 아니고, y이 가리키는 곳을 변경합니다. 따라서 여전히 값이 5 인 위치를 가리 킵니다.

1

y = *x;이 있으면 x가 가리키는 포인터를 포인터 변수 y에 넣습니다. x의 포인터가 가리키는 메모리 영역은 y가 이제 포인터를 가지므로 * y는 5가됩니다. 그러면 x가 가리키는 포인터 영역에 새 포인터를 놓습니다.

int main() 
{ 
    int z; int **x; int *y; 
    x = (int **) malloc(sizeof(int*)); // create a pointer to a pointer variable 
    *x = malloc(sizeof(int));   // create a pointer to an int that is put into the pointer that is pointed to by x (x -> int pointer -> int) 
    **x = 5;       // set the int value pointed to by the pointer that is pointed to by x to 5 
    y = *x; //POINT 1     // assign the pointer to the int value to another pointer variable 
    z = 3; 
    *x = &z;//POINT 2     // assign a new address to the pointer that is pointed to by x. 
    printf("%d\n",*y);    // print the value pointed to by y which is 5 
    printf("%d\n", **x);    // print the value that is pointed to by the pointer which is pointed to by x which is 3 
    **x = 2; 
    printf("%d\n",*y); 
    *y=1; 
    printf("%d\n",z); 
}