개발

구조체 메모리 할당

구조체 메모리 할당에 대해서 특이한(?) 경험을 기록한다.

 

다음과 같이 배열을 멤버로 가지는 구조체를 생각하자.

typedef struct st {
	unsigned char array[20];
}st;

 

이 구조체의 크기는 20바이트임을 예상할 수 있다.

 

만일, 이 구조체 멤버의 크기를 늘려 사용하려면 어떻게 해야 할까? 구조체를 변경하거나 새롭게 생성하지 않고..

 

st A;

A.array[25] = 27;	//stack corruption

현재 array가 20개의 방을 가지고 있다. 하지만 25번째 방에 값을 넣고자 한다.

이러한 모습은 범위를 벗어난 메모리 공간을 참조하기에 stack corruption이 발생한다.

어떻게 25번째 방에 값을 넣을 수 있을까?

 

이를 해결하기 위해 동적할당을 사용한다.

st* B = NULL;

B = (st*)malloc(sizeof(st) * 5);
B->array[25] = 27;

free(B);

이 코드가 무엇인가 싶다..

B를 sizeof(st)의 5배로 할당하였다. 보통 이렇게 할당할 경우 st 구조체가 5개가 붙어있는 모습을 생각할 것이다.

하지만 구조체 크기로 sizeof(st)의 5배에 해당하는 크기를 할당한 것이다.  

 

B->array[97]에도 값을 할당할 수 있다. 죽지 않는다..

 

운영체제별로 다를 수 있으니 확인을 하는 것이 좋다. 또한 구조체 멤버로 여러 변수가 존재한다면 어떠한 결과를 가져올지 모른다. 위와 같은 경우만 고려해보았다.

 

 

'개발' 카테고리의 다른 글

ulimit 명령어와 Select, Poll 함수  (0) 2020.10.12
The file couldn’t be opened because you don’t have permission to view it.  (0) 2020.10.07
호출 규약  (0) 2020.09.22
PFX 인증서 생성  (0) 2020.06.19
BouncyCastle  (0) 2020.06.19