본문 바로가기

C언어/C언어17

[C언어]함수 호출을 통한 스택 메모리 이해[1](by 어셈블리어) 이번 글에서는 간단한 함수 호출을 하는 코드를 어셈블리어로 보면서 스택메모리가 실제로 어떻게 변수를 쌓아가는지를 배우겠습니다. 이번글에 들어가기 전에 먼저 알아야 될 용어들은 EBP (Extended Base Pointer), ESP (Extened Stack Pointer) 스택프레임입니다. EBP, ESP, 스택프레임이란? EBP (Extended Base Pointer)는 현재 스택프레임의 첫 주소입니다. EBP (Extended Stack Pointer)는 영어를 보시다시피 현재 스택이 어디까지 채워져 있는지 보여주는 포인터입니다. 스택프레임 (Stack Frame)은 각 함수가 사용하는 스택 메모리 범위입니다. 스택 프레임은 보통 ebp, esp사이의 범위입니다.(하지만 esp는 움직이는 포인터.. 2023. 2. 21.
[C언어]강제 형변환 C언어 강제 형변환 문제 ( 이 코드의 실행결과는 어떻게 나올까요?) #include #include int main(void) { /* int abs(int n); abs함수는 절댓값을 알려주는 함수 */ printf("%d %d\n", abs(4.48), abs(-5.58)); return 0; } 이 문제에서 함수에 정수가 들어가야 되는데 실수가 들어가면 어떻게 되지? 에라 모르겠다 4, -5 나오겠지 라고 생각했다면 이 글을 제대로 읽어보시길 바란다. 답은 맨 아래에 있음! 강제 형변환 이전 글에서 암시적 형변환에 대해서 알아 봤는데, 이번에는 강제 형변환에 대해서 알아보자. 강제 형변환은 영어로 Explicit Conversion 이라고하고 개발자가 직접적으로 형(Type)을 강제로 변환시키는 .. 2023. 2. 17.
[C언어]스택(Stack) 메모리 스택 메모리 (LIFO, Last In Firtst Out) 스택 메모리는 각 함수(main함수도 함수다)에서 사용하는 지역 변수등을 임시적으로 저장하는 공간이다. 스택 메모리의 크기는 프로그램 빌드시 결정이 된다(함수를 다 호출할 때 필요한 메모리를 컴파일할 때 결정) 스택 메모리 위치는 프로그램 실행시에 운영체제가 알아서 붙여준다.(가상 페이징, 가상 메모리 개념) 운영체제가 알아서 붙여주기에 반드시 그림처럼 '코드, 데이터, 힙, 스택'순으로 주소가 생기지는 않지만, 전통적으로 그래왔기 때문에 그림을 이렇게 표현하였다. 함수가 호출이 될 때마다 함수에서 필요한 공간만큼 스택에서 떼어 줬다가 함수가 반환을 하면 지워버린 다는 개념 즉, 함수 메모리 영역으로 스택 메모리라고 불린다. 함수 호출 될 때 .. 2023. 2. 17.
[C언어]함수 매개변수에 함수를 넣으면 순서대로 작동할까?(함수 매개변수의 평가순서) 함수 매개변수의 평가순서 간단한 코드의 실행결과를 맞춰보시라 [문제] 자주 하는 실수 1 #include int add_ten(void) { static int number = 0; number += 10; return number; } int main(void) { printf("%d %d %d\n", add_ten(), add_ten(), add_ten()); return 0; } 1. 10 20 30 2. 30 20 10 3. 알 수 없음 정답은.... 알 수 없음!! 엥? Visual Stdio에서 돌리니까 30 20 10 나오던데요? C표준에서는 함수 매개변수 안에 함수를 줄줄이 넣었을 때 어떤 함수부터 호출되는지는 명시하지 않았다.(어떻게 하던지 컴파일러 마음이다) 이런 매개변수 안에 있는 계.. 2023. 2. 17.