*2차원 배열 vs 다중 포인터
int arr2[2][2] = { {1, 2}, {3, 4} };
int** pp = (int**)arr2;
cout << **pp << endl;
=> Crash 나는 이유는 ?
0x00000001 이란 메모리의 값은 없음.
int* p1 = (int*)arr2;
cout << *p1 << endl; // 1
int(*s1)[2] = arr2;
cout << s1 << endl; // s1주소
cout << *s1 << endl; // s1주소
cout << s + 1 << endl;
cout << *(s + 1) << endl;
=> s1, *s1 두 값은 왜 같을까 ??
' * ' 는 우리가 해당 주소로 이동해 값을 보기 위해 사용하는데,
int* number = &something;
*number 는 해당 주소의 값으로 가서 int 만큼의 데이터를 읽은 값이 된다.
그렇다면,
s1 에서 *s1 은 해당 주소의 값으로 가서 'int [2]' 만큼의 읽은 값은 무엇이 되야할까??
'int [2]' 만큼의 데이터를 표현할 수 있나 ?? => 없다.
따라서, int[2] 만큼의 데이터를 대표할 수 있는 무언가가 값이 되어야하는데
그것이 바로 'int[2] 의 값의 첫번째 주소값' 이다.
결과적으로, 해당 타입의 데이터가 여러 데이터로 잡혀있을때 (ex.int[2])
그것을 나타내는 것이 첫번째주소값이기 때문
* 스택 메모리의 주소를 실수로 넘겨주었을 때
디버그 모드일 때, 메모리가 cccccccc 로 나타나는 이유 ??
=> 혹시라도 메모리가 침범해서 다른 값으로 바뀌었다면 컴파일러가 알려주기 위해
Release 모드일 땐, 버그를 잡지 못함.
int* TestPtr()
{
int a = 1;
return &a;
}
void TestWrong(int* p)
{
int a[100] = {};
a[99] = 0xAAAAAAAA;
*p = 12312313;
}
int* Pointer = TestPtr();
TestWrong(Pointer);
=> 함수가 실행되며 한번 잡았던 스택프레임의 주소를 자칫 실수로 TestPrt 에 건내주었고
지역변수로 큰 배열을 0 으로 초기화했는데,
그 주소의 값을 바꾸게 되면 0이 아닌 다른 값이 되어버림.
=> 즉, 스택 프레임 영역 안 위치를 포인터값으로 넘겨주어서 발생하는 문제
=> 나중에 찾기 힘든 버그가 될 수 있음. => '메모리 오염'
=> 함수에서 주소값을 넘겨줄 때 항상 조심해야함.
=> 결국,
포인터, 참조 를 다룰 때에는 정말로 그 값이 유효한지
'항상 주의깊게' 살펴봐야함.
'프로그래밍 > C++' 카테고리의 다른 글
#38. 객체지향의 시작 (0) | 2022.07.19 |
---|---|
#37. 파일 분할 관리 (0) | 2022.07.19 |
#35. 다차원 배열 (0) | 2022.07.19 |
#34. 다중 포인터 (0) | 2022.07.19 |
#33. 포인터 & 배열 (0) | 2022.07.19 |