프로그래밍/C++

#36. 2차원배열 &다중포인터

코딩하는상후니 2022. 7. 19. 22:08

 
*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