작성
·
442
0
int a[100] = {};
a[99] = 0xAAAAAAAA;
int b = 0xAA;
로 TestWrong 함수의 내용을 작성하고 디버깅을 해봤는데
스택 함수는 높은 주소 -> 낮은 주소로 이동한다고 알고 있는데 &(a[0])의 값(0x004FF45C)이 &(a[99])의 값(0x004FF5E8)보다 더 낮았습니다. 배열의 원소들이 스택에 들어갈 때는 높은 index의 원소들부터 먼저 들어가게 되는 것인가요?
2. 1번과 연계해서
0x004FF450 000000aa -> &b
0x004FF454 cccccccc
0x004FF458 cccccccc
0x004FF45C 00000000 -> &a[0]에서
&a[0]과 &b 사이에 있는 c들도 오버플로우 감지용이 맞을까요?
3. 유효하지 않다는 의미는 메모리가 더 이상 유효하지 않다는 것은 엄밀히 따지면 아니고 스택 프 레임 관리를 할 때 커서를 쭉 당겨서 main 관련 스택프레임까지만 유효하다고 규칙을 정한 것 이라고 하셨는데 둘의 차이가 정확히 어떻게 되는 것인가요? 고민을 많이 해봤는데도 잘 모르겠습니다...;;
4. TextRPG3 내용이긴 하지만, 메모리 오염 내용에서, 지역변수가 존재하는 함수의 하위함수에서는 해당 지역변수의 주소값을 매개변수로 쓰든 output으로 쓰든 다 괜찮고 해당 함수의 범위 바깥에서만 사용 안하면 된다로 이해하면 될까요?
5. int(*p2)[2] = arr2;에서 p2에 int(*)p2 대신 int(*)[4]나 int(*)[2][2] 형식이 못 들어가는 이유는 컴파일러가 그냥 그렇게 정해주었기 때문인가요?
답변 1
0
1.
스택은 높은 주소에서 낮은 주소로 늘어나며 사용하지만, 변수 할당은 거꾸로입니다.
100번 주소에 할당된 4바이트 변수는 100~103 주소를 차지하게 됩니다.
이는 스택에 의해 100번 주소를 할당 받았더라도 동일합니다.
마찬가지로 배열이 20바이트를 차지하는데, 100번 주소에 할당되었다면 100~119 주소를 차지하게 됩니다.
딱히 [배열이 스택에 들어갈 때] 유별난 행동을 보이는 것은 아닙니다.
2. 모릅니다. 메모리 쓰레기 값일 수도 있고, 컴파일러에 의한 값일 수도 있고 일일히 의미를 부여할 필요 없습니다.
3. 메모리에서 해제되지 않아 접근은 할 수 있지만, 사용하면 안된다는 의미입니다.
정말 해제된 메모리라면 접근하는 순간 크래시가 나겠죠.
4. 해당 주소가 유효하면 사용해도 유효하지 않으면 사용하면 안되겠죠.
5. C++ 문법 때문입니다.
전체적으로 질문이 너무 세세한 디테일에 집중되어 있습니다.
이런 부분들은 궁금해하는 것은 좋은 현상이지만,
구글링을 통해 스스로 연구를 하고 답을 찾으셔야 합니다.
1. 아하...배열을 이루고 있는 원소들이 스택에 들어올 때는 개별 변수처럼 차례로 들어올 거라고 착각해서 그런 것이었네요;; 데이터들의 묶음 1개가 통째로 스택에 들어온다고 생각해야겠군요...
2. 이전 답변들에서는 호텔에 비유해서 설명해주셨었는데 호텔에서 마지막 체크아웃한 손님(*ptr)과 새로 들어온 손님은 &b인 거 같은데 왜 &a[99] 근처에서 *ptr이 잡히는 것인가요?
3. 메모리가 유효하지 않음 - 해당 호텔 방 자체(메모리 주소)가 폐쇄됨
커서를 당긴 부분까지만 유효함 - 폐쇄되지는 않았는데 체크아웃하지 않고 계속 있다가 새로운 손님이 체크인해서 들어올 경우 crash 발생
이렇게 이해하면 좋을까요?