모두의 코드 커뮤니티

포인터관련 정말 간단한 질문이 있습니다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#include <stdio.h>
int main() {
int a;
int* pa = &a;
int* pb;

*pa = 3;    
pb = pa;
//*pb = *pa;

printf("pa 가 가리키고 있는 것 : %d \n", *pa);
printf("pb 가 가리키고 있는 것 : %d \n", *pb);

return 0;

}

여기서보면, 주석처리되지 않은부분을 실행하면 *pa=3, *pb=3이 됩니다.
pa=pb, 즉 pa의 주소값을 pb에 대입해서 pb또한 a를 가르키게 한다. 여기까지는 알겠는데
주석된부분처럼 *pa값을 직접 *pb에 넣으니 오류가 나더라구요, 오류는 pb의 초기화가 안이루워졌다.
그래서 선언부에 pb=0;을 선언하고 해봐도 오류가납니다.
주소값끼리는 대입이 가능하지만, 포인터를 직접 포인터에 넣는 대입은 불가능 한건가요??

1 Like

안녕하세요.

포인터의 주소값끼리 대입이 가능한것 맞구요, 포인터가 가리키는 값끼리 대입하는것도 가능합니다.
단, 포인터의 주소값이 존재할 떄 가능합니다.
반면에,
int *pb = 0;
*pb = *pa;
라고 했을떄, *pb에 어떤 값을 대입하거나 접근하는것은 불가능합니다. 주소값 0자리는 "주소가 없음"을 표시하는 것이어서, 주소값 0자리에 값을 대입하는것이 불가능합니다.

예를 들어 어떤 건물에게 실제하지 않는 주소를 붙인다면, 나중에 그 건물이 어떤 주소에 있는지 알수 없게되어 찾아가는것도 불가능해지겠죠.
따라서, pb를 0으로 초기화 했을때는 *pb에 접근해, 어떤 값을 대입하는것이 불가능해서 segmentation fault를 일으키는 것입니다.

pb = pa;

라고 미리 pb에게 0이 아닌 주소값을 줬다면, *pb로 접근하는것이 가능합니다.

1 Like

정확하십니다 :slight_smile: 포인터는 반드시 실제로 존재하는 변수나 상수의 주소값을 가지고 있어야 합니다.