본문 바로가기
C++/기초

C++ 기초 : 구조체 포인터

글: 시플마 2024. 4. 4.

구조체 포인터에 대해 알아보기 전에

먼저 구조체부터 짧게 알아보죠.

 

 

아래 코드를 보면

 

구조체가 있습니다. 

 

형태는 int형 멤버 a와 float형 멤버 f가 있습니다.

자료형은 MYST입니다.

 

이 구조체를 통해 MYST형 변수 s와 

MYST형 변수 s2를 선언하였습니다.

 

 

여기서 주의할 점은 멤버 a와 f는 변수가 아닌 

멤버라는 점입니다.

 

위 그림처럼

MYST는 자료형이고 변수는 s와 s2입니다.

이 s와 s2 각각에 속해 있는 a와 f는 멤버이죠.

 MYST는 자료형 변수 s에 int형 멤버 a와 float형 멤버 f가 있고,

MYST는 자료형 변수 s2에 int형 또 다른 멤버 a와 float형 멤버 f가 있는 겁니다.

 

 

 


 

 

 

 

코드를 통해 구조체 포인터를 알아봅시다.

 

구조체도 일종의 자료형입니다. 

 

그래서 포인터 변수로도 사용할 수 있죠.

 

MYST형 변수 s의 주솟값을 저장하고 있는

MYST형 포인터 변수 pST를 선언하였습니다.

 

pST를 역참조하여 멤버 a에 접근하고 a에 100을 넣었습니다.

이후 멤버 f에도 접근하여 3.14를 대입하였습니다.

 

실행 결과 변수 s 멤버에 값이 대입된 것을 확인할 수  있습니다.

 

 

포인터 변수를 통해 멤버에 접근할 때는 

 

*와 괄호를 없애고 화살표를 통해

조금 더 간단하게 멤버에게 접근할 수도 있습니다.

 

 

 


 

 

 

 

여기서

 

pST + 1; 

 

이런 코드를 추가하면 포인터 변수는 얼마큼 이동한 주솟값을

저장할까요? 8Byte 이동하여 그곳의 주솟값을 저장할 것입니다.

 

이유는 MYST라는 구조체(자료형)은 두 개의 4Byte 멤버(int와 float)를

가지고 있고 이로 인해 MYST의 크기는 8Byte이기 때문이죠.

이러한 자료형을 가진 pST는 한 번 이동할 때마다 8Byte씩 이동하게 되는 것이죠.

 

 

구조체의 주솟값을 저장하고 있는 포인터 변수도 주의할 점이 있습니다.

바로 자료형이 일치하지 않는 변수의 주솟값을 저장하고 있을 때입니다.

 

예를 들어 MYST형 포인터 변수가 char형 변수의 주솟값을

저장하고 있다고 해 보죠.

 

그 상태에서 

 

(*pST).f = 33.1f; 

 

위와 같은 코드를 실행하면 어떻게 될까요?

 

아래 그림과 같은 상황이 발생합니다.

 

pST는 char형 변수 c의 주솟값인 1000을 저장하고 있습니다.

 

이 상태에서 멤버 f에 값을 대입하면 앞에 4Byte는 int형 멤버 a의 자리로 인식하고 

건너뛴 후, 1004번지가 float형 멤버 f의 자리라고 생각해 값을 대입하게 되는 것이죠.

 

어떤 값이 들어가 있는지 모를 메모리에 값이 들어가는 것입니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB

 


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 동적 할당 (2)  (2) 2024.04.06
C++ 기초 : 동적 할당 (1)  (0) 2024.04.04
C++ 기초 : wcscmp 함수  (0) 2024.04.04
C++ 기초 : 문자열 (4)  (0) 2024.04.03
C++ 기초 : 문자열 (3)  (0) 2024.04.03