파일 접근 모드 파일 모드 한정자 파일 접근 모드와 같이 작성해서 사용한다 ex. rb, wt, … 파일 접근 모드, 파일 모드 한정자 예시 with. fwrite() #define _CRT_SECURE_NO_WARNINGS #include enum { LENGTH = 5 }; int main(void) { int data[LENGTH] = { 11, 22, 33, 44, 55 }; size_t count; FILE* out = fopen("output.txt", "wb"); count = fwrite(data, sizeof(data[0]), LENGTH, out); // fwrite() 함수는 binary file을 적을 때 쓰는 함수 // out에 LENGTH개 sizeof(data[0])만큼씩 da..
스트림 데이터 스트림의 약자이다 데이터가 흘러들어오는 선을 의미하며, 다양한 선이 존재한다 데이터 스트림의 종류 stdin 스트림: 키보드를 통한 입력 데이터 스트림 stdout 스트림: 콘솔(콘솔 창)을 통한 출력스트림 File 스트림: 입출력이 가능한 파일스트림 String 스트림: 입출력이 가능한 문자열 스트림 stdin > stdout 일반적으로 많이 사용하는 스트림 형태이다 stdin을 통해서 데이터를 받아서 stdout으로 데이터를 출력한다 스트림 (stdin, stdout, file, string 등)은 경계선 너머의 장치이다 따라서, 버퍼를 통해서 한꺼번에 가져오는 동작이 필요하다 여기서 버퍼는 데이터를 일시적으로 저장하는 메모리 영역이다 만약, 키보드를 잡고 있는 사람이 의도적으로 “cl..
열거형(Enummeration) 매크로 상수와 유사하며 비슷한 종류의 매크로 상수를 여러 개를 동시에 정의하는 것이다 문자열이나 int를 직접적으로 사용하는 것은 가독성에 좋지 않아서 열거형을 사용한다 enum ASCII { ASCII_A = 65, ASCII_B, ASCII_C, ASCII_D }; 열거형 vs. 매크로 상수 매크로 상수는 디버깅에 취약하다 전처리기 단계에서 매크로 상수가 모두 값으로 치환되어 버리기 때문이다 반면에, 열거형은 상수로 치환되지 않고 변수명 그대로 디버깅이 가능하다 또한, 열거형은 메모리를 차지하지 않으면서 동시에 디버깅까지 가능하기 때문에 매크로 상수보다는 열거형을 사용하는 것이 좋다 공용체(Union) 어떤 메모리 주소를 어떤 방식으로 읽을 것인가와 관련된 구조체이다 ..
비트필드(bit field)기본 자료형 중 가장 작은 자료형이 1바이트(8비트)이다하지만, 비트 단위로 사용을 하고 싶다면비트필드를 사용하면 된다일련의 비트를 멤버로 가지는 구조체이다 unsigned char b0 : 1;// unsigned char는 2바이트 자료형이지만 // 1비트만 사용하겠다는 비트 필드가 적용되었다 비트 플래그(bit flag)비트필드 문법을 가지고 비트 플래그를 구현할 수 있다#include struct bitflags{ unsigned char c0 : 1; unsigned char c1 : 1; unsigned char c2 : 1; unsigned char c3 : 1; unsigned char c4 : 1; unsigned char c5..
바이트 정렬 요구사항 시스템 별로 메모리에 효율적으로 접근하기 위해서 n 바이트 배수인 시작 주소에서만 메모리 접근이 가능하게끔 한다 예를 들어, x86 시스템은 4바이트 단위로 읽어오고 4바이트마다 정렬(aligned)되어 있다 따라서 각 컴파일러가 알아서 각 멤버의 시작 위치를 그 경계에 맞춰준다 그렇다면, 안 쓰는 바이트를 덧붙이는 경우가 발생하고 이를 패딩(padding)이라고 한다 서로 다른 시스템에서 저장한 파일을 서로 읽으려 할 때, 바이트 정렬 요구사항이 다르면 전혀 다른 데이터가 읽어질 수도 있다 구조체 바이트 정렬 방식 구조체에서 바이트 정렬은 2가지 규칙을 따른다 1. 각각의 자료형 크기의 배수에 해당하는 위치에만 들어간다 2. 끝이나는 구간은 반드시 구조체에서 가장 큰 바이트 배수로..
버퍼, 버퍼링 버퍼는 경계선을 넘어서 데이터를 주고 받을 때 데이터를 주고 받는 것 자체가 (여기서 경계선이란 컴퓨터와 인터넷의 사이를 의미한다) 로컬 PC에서 주고 받는 것과 비교했을 때 현저하게 느리다 따라서 한 번 보낼 때 한꺼번에 최대한 많이 보내는 것이, 한 번 받을 때도 한꺼번에 최대한 많이 받는것이 효율적이다 즉, 버퍼 개념을 통해 쌓아두었다가 보낼 수 있을 때 최대한 많이 보내는 것이다 이를 무선 공유기에서는 버퍼의 크기를 직접 설정할 수도 있다 #include #include #define BUFFER_LENGTH (32) static size_t s_buffer_index = 0u; static char s_buffer[BUFFER_LENGTH]; void buffered_print(c..
얕은 복사(Shallow Copy) 실제 데이터가 아니라, 주소만 복사되는 것을 얕은 복사라고 한다 변수명만 다르고, 같은 주소를 공유하고 있는 상태이다 깊은 복사(Deep Copy) 서로 다른 메모리 주소를 가지면서 해당 메모리 주소에 적힌 값은 같은 상태이다 구조체 멤버에 배열 vs. 포인터
typedef type definition의 약자이다 이미 정의되어 있는 자료형에 새로운 별명을 지어주는 것이다 컴파일러 및 플랫폼에 따라 size_t 자료형의 정의가 다르지만 일반적으로 typedef unsigned long size_t; 로 size_t 자료형도 typedef 된 것이다 _t가 접미사로 붙으면 typedef 된 것을 의미한다 typedef 사용 예시 1 typedef int INT int a = 1; INT b = 2; typedef 사용 예시 2 (구조체) #include struct Date { size_t Year; size_t Month; size_t Day; }; typedef struct Date Date_t; int main(void) { Date_t Today; retu..
동적 할당의 처리 단계C언어에서는 프로그래머가 직접 메모리 동적 할당받고 사용 후 반드시 해제를 해야 한다1. 메모리 할당 힙 메모리 관리자(OS에서 제공)에게 원하는 메모리 바이트만큼 요청하고힙 메모리 관리자는 해당 크기의 연속된 메모리의 시작 주소를 반환한2. 메모리 사용 할당된 힙 메모리 시작 주소를 가지고 원하는 작업을 수행한다 3. 메모리 해제힙 메모리 관리자에게 해당 메모리 주소를 돌려주면서 다 썼다고 알린다힙 메모리 관리자는 해당 메모리를 점유되지 않은 메모리 상태로 바꾼다메모리 주소를 돌려주지 않으면 해당 메모리를 계속 점유하고 있는 상태가 되며, 메모리 누수(Memory leak)가 발생한다 동적 메모리 관련 함수 할당: malloc() - 쓰레기값 / calloc() - 0으로 초기화재..