블로그 이미지
devtang
Instagram : @taebr0 devtaehyeong@gmail.com

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2021. 1. 11. 16:21 C++

시스템 메모리 구조는 위와 같이 나뉜다.

Code는 우리가 작성한 코드가 들어가있는 영역이다.

Data영역은 두가지로 나뉘는데 초기화가 되어있는 전역변수나 static 변수,

BSS는 0으로 초기화 되어있는 전역 변수나 static 변수

 

스택은 (LIFO : Last in First out) 구조로 위의 사진에서는 second()부터 순차적으로 할당해제가 된다고 보면 될 것 같다.

 

스택의 메모리가 감당할 수 없는 크기의 메모리를 할당하면 넘치게 되서 오류가 발생한다.

이를 방지하기 위해서는 heap영역에 접근할 수 있는 동적할당이 필요함

 

여기서 중요할점은 delete[] 한 후에 더사용을 해야한다면 반드시 포인터 변수를 다시 초기화하여 엉뚱한 값을 가리키지 않도록 해야한다.

 

delete를 하지 않으면 힙메모리영역에 사용하지도 않는 메모리를 계속 생성해놓을 수 있어서 메모리 누수(memory leak)가 발생할 수 있기때문에 동적할당 시에 반드시 해줘야한다.

'C++' 카테고리의 다른 글

[C++] 이중포인터와 동적 이차원 배열 생성 예제  (0) 2021.01.10
[C++] 포인터와 const  (0) 2021.01.10
[C++] 포인터의 기본  (0) 2021.01.10
posted by devtang
2021. 1. 10. 23:53 C++
#include <iostream>

using namespace std;


int main()
{
	const int row = 3;
	const int col = 5;

	int s2da[row][col] = {
		{1,2,3,4,5},
		{6,7,8,9,10},
		{11,12,13,14,15}
	};

	//동적 2차원 배열 생성
	int **matrix = new int*[row]; 

	for (int r = 0; r < row; r++)
		for (int c = 0; c < col; c++)
			matrix[r] = new int[col];
		
	
	//s2da의 값 복사
	for (int r = 0; r < row; r++)
		for (int c = 0; c < col; c++)
			matrix[r][c] = s2da[r][c];

	//matrix 출력	
	for (int r = 0; r < row; r++)
	{
		for (int c = 0; c < col; c++)
		{
			cout << matrix[r][c] << " ";

		}
		cout << endl;
	}

	// 동적할당 메모리 해제
	for (int i = 0; i < row;i++)
		delete[] matrix[i];

	delete[] matrix;

}

'C++' 카테고리의 다른 글

[C++] 스택과 힙  (0) 2021.01.11
[C++] 포인터와 const  (0) 2021.01.10
[C++] 포인터의 기본  (0) 2021.01.10
posted by devtang
2021. 1. 10. 22:02 C++

//본 게시물은 따배씨++ 강의를 듣고 정리한 학습 노트입니다.

 

 

값을 바꿀수 없는 const int value를 선언하고 마찬가지로 const int *ptr변수에 value의 주소값을 저장한다.

포인터를 통해서도 const int value 변수의 값을 수정할 수가 없다.

 

 

마찬가지로 int value가선언이되었어도 const int *ptr은 저장된 주소의 변수의 값을 바꾸지 않겠다고 생각하면 될거같다.

 

위의 코드를 보면 const int *ptr은 다른 주소값을 받을수 있다.

 

ptr이라는 포인터 변수가 가리키는 주소에 있는 값을 바꾸지 않겠다 라는 것이다. 

 

하지만 포인터 변수가 가리키는 주소 자체를 바꿔버리면 새로운 값을 가질 수 있게된다.

 

const로인해 포인터 변수가 가진 주소를 직접 참조해 값을 바꿀 수는 없어도

저장하는 주소자체를 새로 바꿀 수가 있다.

 

위와 같이 int *const ptr을 선언하게되면 저장되있는 주소의 내부 값을 변경시킬수 있다.

 

주소값 자체를 바꿔버릴 수 있어도 주소가 가리키는 곳에 저장된 값을 바꿀 수 없었는데,

이번에는 역참조로 값을 바꿀 수 있지만, 주소값 자체를 새로 바꾸는 것이 안되는 상황이다.

이것은 주소값을 저장하는 역할에 const 가 적용이 된 것이다.

 

만약 const int *const ptr의 경우라면 저장된 주소값의 변경도 불가능하고, 주소를 참조하여 값을 바꾸는 것도 불가능하다.

 

위의 방식들을 사용할 때는 함수 파라미터로 array를 집어넣을 때, 값과 주소값을 바꾸지 않을 때 필요하다.

 

'C++' 카테고리의 다른 글

[C++] 스택과 힙  (0) 2021.01.11
[C++] 이중포인터와 동적 이차원 배열 생성 예제  (0) 2021.01.10
[C++] 포인터의 기본  (0) 2021.01.10
posted by devtang
2021. 1. 10. 16:10 C++

//본 게시물은 따배씨++ 강의를 듣고 정리한 학습 노트입니다.

 

포인터란?

간단하게 설명하면 메모리의 주소값을 담고 있는 변수라고 볼 수 있다.

 

위의 사진과 같이 x의 변수에 40을 담고

& 연산자를 이용하여 x가 위치한 메모리 주소를 가져올수 있다.

포인터 역시 x의 메모리 주소값을 담고 있으므로 동일한 출력 결과를 가져올 것이다.

 

그러나 C++ 에서 &와 *는 엄연히 다르다.

 

& : reference operator

 

* : de-reference operator

 

 de-reference 에서의 reference 의 의미는

포인터가 "저쪽 주소에 가면 이 데이터가 있어요"라고 간접적으로 가리키기만 하는 것에 대해서, "그럼 거기에 진짜 뭐가 있는지 내가 들여다 볼께" 라며 직접적으로 접근하겠다는 의미라 볼 수 있다.

 

포인터는 x86 에서는 항상 4바이트, x64에서는 8바이트로 할당된다.

'C++' 카테고리의 다른 글

[C++] 스택과 힙  (0) 2021.01.11
[C++] 이중포인터와 동적 이차원 배열 생성 예제  (0) 2021.01.10
[C++] 포인터와 const  (0) 2021.01.10
posted by devtang
prev 1 next