메모리 오염에 대해서 궁금한 것
560
작성한 질문수 36
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++ 문법 때문입니다.
전체적으로 질문이 너무 세세한 디테일에 집중되어 있습니다.
이런 부분들은 궁금해하는 것은 좋은 현상이지만,
구글링을 통해 스스로 연구를 하고 답을 찾으셔야 합니다.
0
1. 아하...배열을 이루고 있는 원소들이 스택에 들어올 때는 개별 변수처럼 차례로 들어올 거라고 착각해서 그런 것이었네요;; 데이터들의 묶음 1개가 통째로 스택에 들어온다고 생각해야겠군요...
2. 이전 답변들에서는 호텔에 비유해서 설명해주셨었는데 호텔에서 마지막 체크아웃한 손님(*ptr)과 새로 들어온 손님은 &b인 거 같은데 왜 &a[99] 근처에서 *ptr이 잡히는 것인가요?
3. 메모리가 유효하지 않음 - 해당 호텔 방 자체(메모리 주소)가 폐쇄됨
커서를 당긴 부분까지만 유효함 - 폐쇄되지는 않았는데 체크아웃하지 않고 계속 있다가 새로운 손님이 체크인해서 들어올 경우 crash 발생
이렇게 이해하면 좋을까요?
visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.
0
561
1
정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?
0
456
1
strcpy() 구현 관련 질문
0
544
1
빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?
0
477
1
클래스 타입의 포인터 질문합니다
0
560
1
입력값을 enum 값에 넣어주는거 이제 막혔나요?
0
505
1
템플릿 특수화 관련 질문
0
393
1
포인터 관련 질문합니다!
0
276
1
Unable to start assembler. Check your settings.
0
852
2
cpu선택
0
552
1
포인터 질문이 있습니다
0
335
1
20:35 에서 구조체 크기에 대한 질문입니다!
0
592
1
iterator 삭제관련
0
419
1
함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!
0
316
1
15 분 45초 대 질문
0
319
0
스택 프레임 질문합니다!
2
316
1
오른값 참조 in 게임
0
394
0
동적할당 질문이 있습니다
0
460
1
안녕하세요 메모리에 대해 질문드립니다.
0
314
1
함수객체 의 매개변수
0
370
1
복사생성자
0
441
1
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
0
431
1
포인터 실습 강의를 보고 궁금한게 있습니다.
0
360
1
스택 오버플로우
2
804
1





