본문 바로가기

C언어24

[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.
[C언어]링크(Link) 단계 (컴파일과 링크가 따로 되어있는 이유) 링크란? 대략적인 과정은 링커가 모든 오브젝트 코드들을 입력받아서 최종실행파일을 출력하는 과정이다. 입력 : 모든 오브젝트 코드들 링커는 오브젝트 코드에 있는 구멍들을 메꿔줘야 하므로 모든 오브젝트 코드들을 입력받는다 처리 오브젝트 파일을 다 모아서 하나의 이진파일로 만들면서 함수들의 위치도 기억하고 있는다 그러다 함수 호출 코드를 만나면 실행위치(구멍)에 함수 주소로 점프하는 코드를 넣어준다 출력 : 최종실행파일(.exe, .out) 파일에서 선언만 되어있고 구현(정의)이 되지 않아서 여전히 구멍으로 남으면 어떡하나요? 이럴 때는 링커가 링커오류를 출력한다. 이는 경고(Warning)가 아니라 애러(Error)이기 때문에 실행파일이 만들어지지 않는다. 왜 컴파일단계와 링크 단계가 분리되어 있는 이유 ... 2023. 2. 16.