프로그래밍 공부

프로그래밍 700

카테고리 설명
  • 매개 변수 개수가 고정되지 않고 호출할 때 마다 인자의 개수가 달라질 수 있는 경우를 말한다. 가변인자를 사용하려면 C언어에서는 stdarg.h 라이브러리를 C++에서는 cstdarg 라이브러리 를 사용한다. 이 라이브러리 를 사용하면 va_list, va-start, va_arg, va_copy, va_end 등의 매크로 함수를 이용하여 가변인자 를 처리할 수 있다. 대표적인 예시는 printf() 함수가 있는데, printf() 함수는 매개변수의 개수가 고정되어있지않으며, 호출할 때 마다 인자의 개수와 형식이 달라질 수 있다는걸 알 것이다. 따라서 printf()함수는 가변인자를 사용하여 처리하게된다. 다음과 같은 함수를 예시로 살펴보자. 위 함수를 살펴보면, print_number 함수를 선언하고,..

  • 스택 프레임은 함수가 호출될 때 마다 새로운 메모리 블록이 할당되어 사용되며, 함수가 실행을 완료하고 반환하면, 해당 스택 프레임은 제거된다. 이러한 스택 프레임의 생성과 제거는 호출스택(Call Stack) 구조에 의해 관리된다. 스택 프레임에는 함수에서 선언된 지역변수, 매개변수, 복귀주소, 호출 스택 포인터(Caller Stack Pointer) 등이 저장된다. 함수에서 변수를 사용하거나, 매개변수를 전달할 때마다 스택포인터 가 이동하면서 해당 변수가 저장될 위치를 지정한다. 함수 실행이 완료되면, 스택 포인터가 원래 위치로 되돌아가며, 이전에 호출된 함수의 스택프레임이 반환될 준비를 한다. 즉, 스택 프레임(Stack Frame)은, 함수에서 선언된 지역변수, 매개변수, 복귀주소, 호출 스택 포인..

  • 호출 스택 포인터 는 C/C++에서 함수 호출이 발생할 때 스택 메모리 구조를 관리하는데 사용되는 포인터 이다. 스택 메모리는 후입선출(Last-In-First-Out) 방식으로 동작한다. 함수가 호출될 때 마다 호출 스택 프레임(Call Stack Frame)이 스택에 쌓이고, 반환될 때마다 해당 프레임이 스텍에서 제거된다. 이때 스택 포인터(Call Stack Pointer)는 현재 스텍프레임의 맨 위를 가리키는 포인터 이다. 이는 스텍메모리 에 대한 접근을 제어하고, 호출 스택 프레임의 크기를 결정하는데 사용된다. ( 스택 프레임에 가장 최근에 들어온 프레임의 바로 윗부분. 다음 프레임이 들어올 시작지점을 가리킨다.) C++에서 n부터 1까지의 정수를 출력하는 재귀함수를 통해서 스택포인터를 살펴보자..

  • C++에서는 구조체를 선언하고 내부에 함수를 생성해줄 수 있다. 그러나, 구조체는 선언전에 메모리할당이 발생하지 않는다. 그럼으로 함수는 CODE 영역에 메모리가 할당되어 실행되게 되는데. 구조체 안에 함수가 존재하지 않음으로 사실 구조체는 함수를 실행할 수 없다. 구조체 내부에서 함수를 선언하고 실행하는건 다음과 같은 방식을 따른다. Print함수가 구조체 내부에서 선언됨을 볼 수 있다. 그러나, 함수는 구조체 내부에 존재하여도 구조체는 선언 전에 메모리 할당이 일어나지 않음으로 함수 메모리에 존재하나. 실행할 수 없다. 그럼으로 구조체 내부에 존재하는 함수는 __thiscall 을 내부에 붙여서 구조체 내부에서 함수를 다시 호출해준 뒤. 괄호 안에 자신의 구조채를 선언하여 동작하게 된다. 즉, 위에서..

  • 심볼 테이블 은 컴파일러가 소스코드를 분석하는 과정에서 생성된다. 이는 변수, 함수 등의 식별자와 해당 식별자가 가리키는 메모리 위치 등의 정보를 저장하는 데이터 구조이다. 다음 코드와 함께 예시를 살펴보자. 위 코드에서 변수 x는 식별자(identifier) 로서 main함수 내부에서 선언되었다. 이때, 컴파일러는 x라는 식별자와 해당 변수가 선언된 메모리 위치 등의 정보를 심볼 테이블에 저장하게 된다. 즉, 심볼 테이블은 소스코드 를 분석하는 과정에서 생성되며, 변수, 함수 등의 식별자와 해당 식별자가 가리키는 메모리 위치 등의 정보를 저장하게 된다. 이 정보를 바탕으로 컴파일러가 실행파일을 생성하게 된다. 만약, 위 코드가 실행되었을 경우 심볼 테이블은 다음과 같이 생성될것이다. 식별자 이름 선언 ..

  • 프로그래밍 언어는 선언시 형식, 변수, 초기화 의 순으로 이루어진다. 다음 예시를 살펴보자. 여기서 int a = 10; 이라는 변수가 선언되었을 때. L-value 는 a이고, R-value 는 10 을 의미한다. L-value R-value 변수 선언시 왼쪽의 변수명 또는, 대입연산자가 들어갔을 시의 왼쪽 변수를 이야기한다. 변수 선언시 오른쪽의 상수 또는 대입연산자가 들어갔을 시의 오른쪽 상수, 변수 를 이야기한다. 식이 끝나도 나중에 다시 접근이 가능하다. int a를 선언했을 때, 나중에 a를 선언함으로써 다시 호출이 된다. 식이 끝나면 나중에 다시 접근할 수 없다. int a = 10 이라고 했을 때. 10이라는 상수가 선언된 후 식이 끝나면 10에 접근할 방법이 사라진다. 변수 그자체이기 때..