void pointer(int *a) {
*a = 100;
}
이런 함수를 작성했다고 치고 궁금한게
포인터 변수가 다른 어떤 변수의 메모리 주소를 저장하는 변수잖아?
근데 애스터리스크(*) 표시가 역참조 연산자고 포인터가 지정한 개체의 '주소'가 아니라'값'에 접근하는 연산자로 알고있는데
위처럼 *a = 100; 이라고 쓸때 100은 그냥 정수지... 어떤 주소를 가진 변수의 내용물이라고 해야하나? 아무튼 변수의 값이 아니잖아
근데 그러면 *a은 도대체 어디에 저장되는거임? 아직 a라는 포인터가 가리키는 변수가 존재하지 않는데..
내가 바보라그런가 설명하기가 난해하다..
a가 가르키고있는 메모리주소공간에 값을 저장
int가 4byte로, a가 가르키고 있는 주소를 0x100이라고 가정하면 0x100번지부터로부터 4바이트를 100으로 저장
음... 근데 저 코드는 *a가 가르키는 주소가 아직 없는거 아녀? a라는 포인터가 갖는 자체의 공간만 있고 아직 따로 뭘 가리키라고 한게 없으니..
저건 함수니까 만약에 너가 호출하면서 매개변수를 전달하겠지? 그 값은 스택에 들어가고 스택에 들어간 매개변수의 주소야 결론 = 매개변수의 메모리 주소에 있는 값을 100으로 수정한다
함수 매개변수로 a의 주소를 받을거고 a의 주소에 값을 넣겠다는 코드임
니 말대로 a의 주소는 함수를 호출하는 런타임에 결정됨
a의 주소가 NULL처럼 유효하지 않다면 segmentation fault 시그널과 함께 죽을 수도 있음 ㅇㅅㅇㅋㅋㅋ
그럼 int *a로 변수를 선언하고 a = &다른아무변수; 이런식으로 지정해주지 않으면, 역참조연산자를 쓰면 그냥 포인터 자기 스스로 가진 메모리 공간에 값을 할당한다는 소리임?
쓰레기값 알지? 초기화 안 하고 쓰면 쓰레기값을 주소로 해서 저장할테니 어디에 그 값이 박힐지 모름. 이걸 메모리 침범, 오염 되었다고 하고 강아지 같은 버그 중 하나임 ㅇㅅㅇㅋㅋㅋ
감솨감솨
cf) *은 역참조 연산자다 - dc App
해당 댓글은 삭제되었습니다.
링킹쪽 아님?ㅋㅋ 데이터영역에 있으니까 링킹과정에서 주소변환 이뤄질텐데
해당 댓글은 삭제되었습니다.
그럼 링커랑 로더보면되겠네
[a] = 100