cyphen156

24.02.05 C언어의 변수 선언시 메모리 사용 위치에 대한 궁금증 본문

잡생각 정리글

24.02.05 C언어의 변수 선언시 메모리 사용 위치에 대한 궁금증

cyphen156 2024. 2. 5. 15:28

반복문 안에서 변수를 선언하고, 초기화 하다가 생긴 의문 

C언어에서 변수를 이미 할당된 변수를 다시 정의하지 않고 그대로 쓰면 똑같이 출력될까?

int main() {
	//초기 공백노드 설정
	int* head = NULL;
	int* end = head;

	while (1)
	{
		int input;
		printf("1 : stackpush , 2 : stack pop, 3 : search, 4 : print stack, 0 : 프로그램 종료\n");
		scnanf("%d", &input);
		menu(input);
	}

	return 0;
}

위의의 코드를 작성하다가 문득 input의 위치에 따라 프로그램 동작이 바뀌게 되는데, 반복문 밖에서 input을 선언하고, 반복문 종료시 입력 버퍼를 초기화 하지 않는다면 어떻게 될까??라는 의문이 들었다.

 

다른 언어는 모르겟지만 C언어에서의 변수의 할당과 해제, 그리고 해제 이후의 재할당 상황에서 대부분의 경우 재할당 시 이전에 할당되었던 위치를 다시 사용하게 된다고 한다. 

가령 main함수 내에서 포인터 변수 pa를 선언하고, 여기에 변수 a의 위치 값을 집어 넣은 뒤 할당 해제하고 다시 변수 b의 위치값으로 초기화 하고 싶다고 한다면 다음과 같이 재정의 에러가 출력된다.

포인터 변수 pa를 할당해제했지만 다시 선언하려했기 때문에 에러가 뜬다

그런데 이미 선언된 변수에 재할당 하는것은 또 된다???

이것은 실제로 메모리 안의 지역 변수가 할당해제된다고 메모리에서 지워지는 것이 아니기 때문에 그렇다.

다시말하면 변수가 아직 메모리에 남아있다는 것을 의미한다.

지역변수의 선언과 할당은 스택 영역에서 실행된다. 그렇기 때문에 선언된 int* pa라는 변수에 대한 정보는 main함수가 끝날 때  사라진다. 물론 사라진다하더라도 이전에 입력한 데이터는 그대로 남아있다. 어떤 위치에 있었는지 모르게 되고, 다른 프로그램 동작으로 인해 메모리 영역이 자유롭 게 사용될 수 있게 될 뿐이지...

다른 위치를 사용하는 방법은 없을까??

있다. 보안상 위험하지만  그냥 이미 선언된 변수에 다시 malloc함수를 호출해 메모리 상의 다른 위치를 가리키게 만들면 된다.

그렇다면 변수 자체를 다시 만드려면 어떻게 해야 할까?

결론은 간단하다.

함수를 만들어서 해당 함수를 호출해 지역 변수를 통해 또 다른 스택으로 넘겨서 선언하면 된다. 

함수를 실행할 때 마다 변수 위치를 다시 할당하니 매번 pa의 위치가 바뀌게 된다.

 

반복문의 경우 반복문 내에서 변수를 선언하면 된다.

 

하다보니 변수의 생명주기에 대해 더 자세히 공부할 수 있었다.

오늘 공부시간 대부분을 여기 날린거같은데 그래도 재밌었으니 된거아닐까?