..
정글 C언어 특강
- C 언어의 특징과 주의점
- 단순하고 강력하지만, 잘못 다루면 위험한 도구
- 숙련자에겐 최고의 무기, 초보자에겐 함정이 가득한 전장
- 핵심 메시지
- 장점: 높은 성능, 하드웨어 제어, 자유로운 표현
- 단점: 안전장치 부족, 실수 시 치명적 버그, 이식성 문제
- 비유: 잘 벼린 칼처럼 유용하지만, 부주의하면 스스로 베일 수 있음
- C 언어 변수 타입의 크기와 플랫폼 의존성
- C 언어는 int, long, short 등의 기본 타입 크기를 표준에서 고정하지 않음
- 대신 최소 비트 수와 타입 간의 상대적 크기 관계만 보장합니다
sizeof(short) <= sizeof(int) <= sizeof(long)
- 이렇게 한 이유는 하드웨어 플랫폼마다 워드 크기(Word Size)가 다르고, 이를 그대로 반영해 이식성을 높이기 위해서
- 예시
- 16비트 마이크로컨트롤러: int -> 2바이트
- 32비트/64비트 PC: int -> 4바이트
- 반면 파이썬은 하드웨어에 직접 포팅할 것을 전제로 하지 않기 때문에
- int의 크기를 고정하지 않고 임의 정밀도로 설계
- 메모리가 허용하는 한 매우 큰 정수를 다룰 수 있음
- 따라서 플랫폼 간에 동일한 수 표현 가능
-
CCTV 등 다양한 컴퓨터에 유동적으로 적용 가능
- 일을 시키는 단위 스테이먼트, 숫자로 나타낼 수 있으면 익스프레션
- 실수: if (x = y) - > if (y 값)
- (i < n && a[i]) -> (i < n & a[i])
- int y = x/*p; // 주석 이미 시작됨 */ -> 명확하게 괄호 습관이 좋음
- printf(‘\n’); // 문자 리터럴을 포인터로 전달
- 연산자 우선순위 (unsigned r = h«4 + l)
- 세미콜론 실수 if (x > big); <- null statement 실행함
- switch의 break 없을 시 case 연속 실행
- 들여쓰기와 상관없음
- 평가 순서 불명확, y[i] = x[i++]; -> y[i] = x[i];
- 포인터와 배열
char *r; // 틀린 부분 -> char *r = malloc(strlen(s) + strlen(t) + 1); strcpy(r, s); strcat(r, t);
- NULL 포인터
char *p = NULL; printf("%s\n", p); // UB
- 매크로와 부작용
#define max(a,b) ((a) > (b) ? (a) : (b)) int a = 1, b = 2, m; m = max(a++, b); // 함수를 쓸 것
- C 포인터
- 기본적인 포인터와 Dereferencing
- 포인터는 다른 변수나 메모리 주소를 저장하는 변수
- 포인터는 자료형을 변환해서 연산할 수 있는 장점이 있음
- 가상 메모리 때문에 1바이트씩 값을 가져와서 해킹같이 할 수가 없음