라벨이 #C언어인 게시물 표시

[C언어] 댕글링 포인터(dangling pointer)

[C언어] 댕글링 포인터(dangling pointer) 댕글링 포인터 (dangling pointer) 현수 포인터, 고아 포인터 등 동적 할당(힙 할당)에서 메모리가 해제 된 곳을 가리키고 있는 포인터 댕글링 포인터란, 이미 메모리에서 해제된 대상을 가리키고 있는 포인터를 말함 발생되는 원인은 동적으로 할당 받은 메모리가 해제되었는데도 포인터 변수가 해제된 메모리 주소를 가지고 있기 때문이다. 이를 방지하기 위해서는 메모리 해제 이후에 반드시 포인터 변수에 NULL값으로 초기화 해준다. 동적 할당 : 힙 영역에 변수를 할당하는 일 힙 영역 : c언어의 메모리 분할 영역 중 하나로 사용자가 직접 변수를 할당/삭제를 관리하는 영역 발생하는 이유   동적 할당된 포인터를 free함수로 해제한 후에도 포인터는 삭제되지 않고 계속 남아있기 때문에 ex)  char* ptr = (char*)malloc(sizeof(char)*5); //힙 할당 ... //ptr 포인터의 사용 free(ptr); //메모리 해제 위의 예에서 free함수에 의해 ptr이 가리키는 메모리는 해제되었지만, ptr은 삭제되지 않고 그대로 메모리가 해제된 지역을 가리킨다. 여기서 ptr은 댕글링 포인터가 된다. 발생하는 문제 만약 실수로 댕글링 포인터를 사용하면 심각한 오류가 발생해 전체적인 프로그래밍 진행에 오류가 남 해결법 동적할당된 포인터 ptr을 매개변수로 받는다. ptr이 NULL 포인터인지 아닌지 검사한다. ptr이 가리키는 힙 메모리를 해제한다. ptr에 NULL을 대입한다. #define FREE(ptr) if(ptr) { free(ptr); ptr =NULL;} // 안전한 메모리 해제를 위한 매크로 함수 출처 https://m.blog.naver.com/PostView.nhn?blogId=ws6263&logNo=100198933152...

[자료구조] 메모리 구조(스택(Stack), 힙(Heap), 데이터(Data) 영역)

이미지
[자료구조] 메모리 구조(스택(Stack), 힙(Heap), 데이터(Data) 영역) C언어의 메모리 구조 프로그램을 실행시키면 운영체제 는 우리가 실행시킨 프로그램을 위해 메모리 공간을 할당 해준다. 할당되는 메모리 공간은 크게 스택(Stack), 힙(Heap), 데이터(Data)영역으로 나뉘어진다. 이러한 메모리 공간이 어떠한 용도에 언제, 어디서 할당되는지 알아보도록 하자 할당 시기 : 프로그램이 실행될 때마다 할당 장소 : 메인 메모리(RAM) 할당 용도 : 프로그램 실행 시 필요한 메모리 공간(지역변수, 전역변수 선언을 위해) 할당 데이터(Data) 영역 전역 변수와 static 변수가 할당되는 영역 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸 됨 위와 같은 코드에서 int형 변수 a,b는 프로그램 실행시, main 함수가 호출되기 전에 데이터 영역에 할당된다. 그렇기 때문에 프로그램이 종료될 때까지 메모리 상에 존재한다. (전역변수가 프로그램이 종료될 때까지 존재하는 이유) 스택(Stack) 영역 함수 호출 시 생성 되는 지역 변수와 매개 변수 가 저장되는 영역 함수 호출이 완료되면 사라짐 스택 영역은 그 이름 그대로 스택의 성질을 띄고 있다. 힙(Heap) 영역 필요에 의해 동적으로 메모리를 할당 할 때 사용 지금까지 데이터영역과 스택영역을 알아보았는데, 저 두가지 영역만 있으면 코드를 문제없이 짤 수 있을것처럼 보인다. 그럼 힙 영역은 왜 필요한 것일까? 제일 첫번 째 그림을 보면 힙 영역은 프로그래머가 할당한다고 되어있다. 그럼 언제 할당을 할까? 배열을 예를 들어서 설명을 하겠다. 우리는 배열을 선언할 때 상수로 선언을 한다. 배열의 길이를 사용자가 입력한 숫자로 잡아주는 것은 비 정상적인 배열선언이다. 왜 비정상적일까? 메모리 구조에 대해서 잘 파악하고 있다면...