C 언어 기초
C 언어의 정수형 크기와 고정 폭 정수형, 정수 승격과 부호 있는·부호 없는 변환, 연산자 우선순위, 비트 연산, switch 문, 값 전달과 포인터, static 변수, 배열과 포인터 연산, 문자열과 sizeof, const, 함수 포인터, malloc·free와 메모리 누수, 댕글링 포인터, 버퍼 오버플로, 구조체의 패딩, 공용체와 엔디언, 비트 필드, 매크로와 조건부 컴파일, volatile, 미정의 동작을 짧은 코드를 따라가는 객관식 문제로 학습합니다.
C 언어 기초: 핵심 정리
C 언어는 OS나 디바이스 드라이버, 마이컴의 펌웨어 등 하드웨어에 가까운 소프트웨어에서 지금도 널리 사용되고 있습니다. 메모리의 주소를 직접 다룰 수 있어 빠른 코드를 쓸 수 있는 반면, int의 크기가 처리계에 따라 다르거나, 계산 도중에 형이 바뀌거나, 배열의 범위를 넘어도 멈추지 않는 등 모르면 실수를 알아차리기 어려운 규칙이 많이 있습니다.
여기서는 짧은 코드를 실제로 실행했을 때의 출력을 따라가는 문제를 중심으로, 정수형의 크기와 stdint.h의 고정 폭 정수형, 정수의 나눗셈, 정수 승격과 부호 있는·부호 없는 값의 비교, 연산자 우선순위, 비트 연산, 단락 평가, switch 문의 폴스루, 값 전달과 포인터 전달, static 변수와 수명, 포인터 연산과 배열, 2차원 배열의 배치, 문자열과 strlen·sizeof, const를 붙이는 위치, 함수 포인터를 학습합니다. 이어서 malloc과 free, 메모리 누수, 댕글링 포인터, 버퍼 오버플로, NULL 포인터, 구조체의 패딩, 공용체와 엔디언, 비트 필드, 매크로와 인클루드 가드, 조건부 컴파일, 임베디드에서의 volatile, 미정의 동작과 컴파일러의 최적화를 다룹니다. 프로그램의 출력은 x86-64 Linux의 gcc로 실제로 컴파일하여 확인했습니다. 의사 코드의 트레이스는 '프로그래밍의 기초(의사 코드 트레이스)', volatile을 사용한 인터럽트나 레지스터 조작은 '임베디드 시스템과 펌웨어', 컴파일러 최적화의 자세한 내용은 '컴파일러', 메모리 배치와 링크는 '링커, 로더, 실행 파일' 분야에서 다룹니다.
C 언어 기초 전체 문제 (40)
- C 언어 규격에서 int형의 크기에 대해 정해져 있는 것으로 올바른 것은?
- 임베디드 프로그램에서 32비트 주변 장치 레지스터의 값을 넣는 변수를 unsigned int가 아니라 stdint.h의 uint32_t로 선언하는 경우가 많다. 주된 이유로 올바른 것은?
- 정수끼리의 나눗셈을 포함하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- 전위와 후위 ++를 사용한 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- if 문의 조건에 =를 쓴 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- 레지스터 값 reg의 비트 2가 1인지를 조사할 생각으로 위의 코드를 작성했다. 실행했을 때의 결과로 올바른 것은?
- uint8_t는 8비트의 부호 없는 정수형이다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- uint8_t는 8비트의 부호 없는 정수형이다. x를 10번 증가시키는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- unsigned char는 8비트, int는 32비트로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- uint8_t는 8비트의 부호 없는 정수형, int는 32비트로 한다. 위의 코드를 실행했을 때의 결과로 올바른 것은?
- int와 unsigned int는 32비트로 한다. 위의 코드를 실행했을 때의 결과로 올바른 것은?
- unsigned int는 32비트로 한다. 위의 코드를 실행했을 때의 동작으로 올바른 것은?
- 'char c = 200;'으로 한 c를 printf의 %d로 표시하는 프로그램을 x86-64 Linux용 gcc로 컴파일하여 실행하면 −56, Arm Linux용 gcc에서는 200이 표시되었다. 차이가 생기는 이유로 올바른 것은?
- &&와 ||의 오른쪽에 b++를 쓴 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- break가 없는 case를 포함하는 위의 switch 문을 실행했을 때의 출력으로 올바른 것은?
- 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
- 위의 함수 f를 3번 연속으로 호출했을 때, 세 번째 반환값으로 올바른 것은?
- C 언어에서 (1) 함수 안에서 static을 붙이지 않고 선언한 지역 변수, (2) malloc으로 확보한 영역, (3) 함수 밖에서 선언한 변수가 각각 존재하는 기간(수명)의 조합으로 올바른 것은?
- int는 32비트(최댓값 2147483647)로 한다. 위의 함수 fact(n)이 n의 계승을 오버플로 없이 올바르게 반환하는 최대의 n은?
- int는 4바이트, 포인터는 8바이트로 한다. int형에 대한 포인터 p의 값(주소)이 0x1000일 때, p + 3의 값은?
- int는 4바이트, 포인터는 8바이트로 한다. 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
- int는 4바이트로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- 문자열을 넣은 char 배열에 대해, 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- 위의 선언 다음에 ㄱ "p = t;", ㄴ "*p = 'x';", ㄷ "q = t;", ㄹ "*q = 'x';" 중 하나를 쓴다. 컴파일 오류가 되는 것의 조합은?
- 함수 포인터 배열을 사용한 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
- fill과 use는 따로 정의된 함수로 한다. 위의 함수의 문제점으로 올바른 것은?
- 위의 함수 make가 반환하는 포인터에 대해 올바른 것은?
- C 언어에서 free(p); 바로 다음에 p = NULL;이라고 쓰는 것이 권장되는 이유로 가장 적절한 것은?
- 위의 함수 save에 8문자의 문자열 "ABCDEFGH"를 전달했다. 일어나는 일로 올바른 것은?
- C 언어에서 NULL 포인터를 참조했을(p가 NULL일 때 *p를 읽었을) 때의 설명으로 올바른 것은?
- char는 1바이트, int는 4바이트이며, int를 4의 배수 주소에 맞춰 두는 일반적인 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- uint32_t는 32비트, uint8_t는 8비트의 부호 없는 정수형이며, 리틀 엔디언 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- 3비트의 비트 필드에 9를 넣는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- #define으로 정의한 매크로 SQUARE를 사용하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
- 헤더 파일 sensor.h를 위와 같이 작성했다. #ifndef, #define, #endif의 세 줄의 목적으로 올바른 것은?
- 위의 코드를 main 함수 안에 써서 실행했을 때의 출력으로 올바른 것은?
- 마이컴의 출력 레지스터를 위와 같이 선언하여 사용하고 있다. 이 선언에 대한 설명으로 올바른 것은?
- C 언어 규격에서 말하는 미정의 동작의 설명으로 올바른 것은?
- int와 unsigned int는 32비트로 한다. 다음 중 C 언어 규격에서 미정의 동작이 되는 것은?
- 위의 함수를 gcc로 최적화를 켜고 컴파일하면 if (p == NULL)의 판정이 삭제되는 경우가 있다. 그 이유로 올바른 것은?
컴퓨터 시스템의 다른 분야
- 컴퓨터 산술 IEEE 754, 고정소수점, 반올림 오차
- 확률·통계와 대기행렬 경우의 수·확률 분포·추정과 검정·M/M/1
- ISA와 어셈블리 RISC-V, 주소 지정 방식, 호출 규약
- 컴파일러 구문 분석, SSA, 최적화, 레지스터 할당
- 링커, 로더, 실행 파일 ELF, 심벌 해석, 재배치, 동적 링킹
- OS와 하드웨어 인터럽트, 시스템 콜, 페이지 폴트
- Linux와 커맨드 라인 기초 셸·권한·파이프·스크립트
- 메모리 계층 구조 캐시, 교체 정책, 세 가지 미스
- 멀티코어와 동기화 MESI, 원자적 명령어, 메모리 배리어
- GPU 프로그래밍 워프, 공유 메모리, 병합 접근, 점유율
- AI 하드웨어·소프트웨어 스택 추론과 학습, 양자화, 루프라인 모델
- 머신러닝의 기초 학습의 종류·평가 지표·신경망
- 임베디드 시스템과 펌웨어 GPIO, UART/SPI/I2C, RTOS
- HDL과 검증 Verilog, 래치, 상태 머신, 테스트벤치
- I/O 인터페이스와 버스 PCIe, USB, SerDes, CXL
- 네트워크 기초 TCP/IP, 서브넷 계산, DNS, TLS
- 웹 기술 기초 HTTP·Cookie·REST·CORS·캐시
- 무선 통신의 기초 변조·OFDM·MIMO·RF 회로
- 정보 보안 기초 암호, 인증, 웹 공격과 대책
- 데이터베이스 기초 SQL, 정규화, 트랜잭션
- 자료 구조와 알고리즘 시간 복잡도, 탐색, 정렬, 그래프
- 프로그래밍의 기초(의사 코드 트레이스) 의사 코드, 트레이스, 배열, 재귀
- 소프트웨어 개발과 프로젝트 관리 개발 프로세스, 테스트, 일정·비용 관리
- 경영 전략과 회계의 기초(전략 분야) 회계, 손익분기점, 경영 전략, 마케팅
- 서비스 관리와 시스템 감사 SLA·인시던트와 문제·감사와 내부 통제
- 시스템 구성과 신뢰성 설계 이중화·RAID·백업·클라우드
- 성능 분석 암달의 법칙, CPI, 병목
- 하드웨어 보안 사이드 채널, 시큐어 부트, TEE, PUF
- 전력 관리 DVFS, 파워 게이팅, 슬립 상태