구조체 메모리 할당에 대해서 특이한(?) 경험을 기록한다.
다음과 같이 배열을 멤버로 가지는 구조체를 생각하자.
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 |