C

· C
C 언어에서 typedef struct를 사용하는 이유와 실전 팁구조체는 C 프로그래밍에서 매우 중요한 데이터 구조 중 하나입니다. 이를 정의할 때 typedef 키워드를 사용할지, 아니면 단순히 struct로 정의할지 고민한 적이 있을 것입니다. 이번 글에서는 이 두 가지 방식의 차이와 활용 사례를 살펴보고, 어떤 상황에서 어떤 방식을 선택하면 좋은지 설명합니다.1. struct와 typedef struct의 기본 차이C 언어에서 구조체를 정의하는 방법은 크게 두 가지입니다.1.1. struct 정의구조체를 정의하면 해당 구조체 이름은 struct 태그 네임스페이스에 저장됩니다. 따라서 변수를 선언할 때마다 struct 키워드를 사용해야 합니다.struct MyStruct { int a; i..
· C
C 언어에서 배열을 빠르고 효율적으로 초기화하는 다양한 방법배열을 초기화하는 작업은 C 언어에서 자주 사용되는 기본적인 기능입니다. 하지만 배열의 모든 요소를 특정 값으로 초기화하는 데는 여러 가지 방법이 있습니다. 이번 글에서는 C99 이상의 표준 문법, GNU 확장 기능, 그리고 memset의 활용법까지 다양한 접근 방식을 다룹니다.1. 기본 배열 초기화C 언어에서 배열을 초기화할 때 가장 기본적인 방법은 {}를 활용하는 것입니다.1.1. 배열을 0으로 초기화다음과 같이 {} 또는 {0}을 사용하여 배열의 모든 요소를 0으로 초기화할 수 있습니다.int array[10] = {0}; // 모든 요소를 0으로 초기화1.2. 특정 값으로 초기화특정 값으로 초기화하려면 값을 하나씩 나열해야 합니다.int ..
· C
C++에서 CPU 사이클 카운트 측정: __rdtsc와 플랫폼별 구현법1. 문제 정의CPU 사이클 카운트는 성능 측정 및 미세한 코드 최적화에 유용합니다. C++에서 이를 구현하려면 __rdtsc 인트린직 함수나 어셈블리를 활용해야 하며, 플랫폼별 차이를 이해해야 정확한 코드를 작성할 수 있습니다. 이번 글에서는 Windows와 Linux에서 CPU 사이클을 읽는 방법을 설명합니다.2. rdtsc 명령어란?rdtsc(Read Time-Stamp Counter)는 CPU 클럭 사이클을 읽는 x86 명령어입니다. 이 명령은 고속으로 실행되며, CPU의 클럭 주기에 따라 증가하는 값을 반환합니다. 일반적으로 성능 측정 및 벤치마킹에서 사용됩니다. 3. Windows에서 __rdtsc 사용하기Windows 환경..
· C
C에서 Enter 없이 키 입력 처리하기: getch와 termios로 구현1. 문제 개요일반적으로 C 프로그램은 표준 입력에서 데이터를 받을 때 Enter 키 입력을 필요로 합니다. 하지만 게임 개발이나 실시간 입력 처리가 필요한 경우, Enter 키를 기다리지 않고 사용자 입력을 즉시 처리해야 할 때가 있습니다. 이번 글에서는 Windows와 Linux 환경에서 Enter 키 없이 한 글자를 입력받는 방법을 설명합니다.2. Windows에서 getch 함수 사용Windows 환경에서는 라이브러리에 포함된 _getch() 함수로 간단하게 구현할 수 있습니다. 이 함수는 Enter 키를 누를 필요 없이 입력된 키를 즉시 반환하며, 입력된 키를 화면에 출력하지 않습니다.예제 코드:#include #inc..
· C
C 언어에서 공백을 포함한 문자열 입력 받기: scanf와 fgets 활용법1. 문제 개요C 언어의 scanf는 문자열을 입력받을 때 기본적으로 공백을 기준으로 데이터를 구분합니다. 사용자가 이름처럼 공백이 포함된 문자열을 입력할 경우, scanf는 첫 번째 단어까지만 읽고 이후의 데이터는 무시합니다.이번 글에서는 scanf로 공백을 포함한 문자열을 읽는 방법과, 이를 대체할 수 있는 fgets의 안전하고 효율적인 사용법을 소개합니다.2. scanf를 활용한 공백 처리2.1 기본 scanf의 제한scanf는 %s 형식을 사용할 때 공백을 만나는 즉시 입력을 종료합니다. 따라서, "Lucas Aardvark"라는 이름을 입력하면 "Lucas"만 읽히고, 나머지는 무시됩니다.예제:#include int ma..
· C
1. 문제 개요C 언어에서 다차원 배열을 동적으로 할당할 때, 많은 프로그래머가 포인터 배열(pointer-to-pointer)을 사용하는 방식을 배웁니다. 그러나 이는 실제로 비효율적이며 잘못된 접근입니다. 본 글에서는 포인터 배열 방식의 문제점과 진정한 다차원 배열을 동적으로 할당하는 방법을 소개합니다.2. 포인터 배열 방식의 문제점2.1 메모리 비연속성포인터 배열 방식은 각 차원의 메모리를 별도로 할당하므로 메모리가 연속적이지 않습니다. 이는 CPU 캐시 효율성을 떨어뜨리고, 힙(fragmentation)을 심화시켜 메모리 관리가 복잡해집니다.int** arr = malloc(sizeof(*arr) * x);for (size_t i = 0; i 2.2 성능 저하메모리가 분산되어 있어 반복 작업 시 ..
· C
1. 배열 Decay(포인터 변환)란?C나 C++에서 배열은 특정 조건에서 포인터로 변환되며, 이를 배열 Decay라고 부릅니다. 배열 Decay는 배열의 타입 정보와 크기 정보가 손실되고, 배열의 첫 번째 요소를 가리키는 포인터로 변환된다는 점에서 중요한 개념입니다.2. 배열 Decay의 특징타입 손실 배열 int numbers[5]는 원래 int[5] 타입이지만 Decay 후 int* 타입으로 변환됩니다.크기 정보 손실 Decay된 배열은 원래 배열의 크기 정보를 잃습니다. 예를 들어:int numbers[5];printf("%zu\n", sizeof(numbers)); // 20 (5 * sizeof(int))int *ptr = numbers;printf("%zu\n", sizeof(ptr)); ..
· C
C언어에서 scanf() 함수는 입력 데이터를 처리할 때 **개행 문자('\n')**를 버퍼에 남기는 특성이 있습니다. 이로 인해 입력이 제대로 처리되지 않거나 예상치 못한 결과가 발생할 수 있습니다. 특히, %c와 같은 문자 입력을 처리할 때 이 문제가 두드러집니다. 아래에서 문제의 원인과 해결 방법을 단계별로 살펴보겠습니다.1. 문제의 원인scanf() 함수는 입력 데이터를 처리할 때, 공백 문자(스페이스, 탭, 개행 등)를 기본적으로 무시합니다. 하지만 %c, %[ ], %n과 같은 형식 지정자에서는 공백 문자를 무시하지 않고 그대로 처리합니다.따라서 숫자나 문자열 입력 이후에 남아 있는 개행 문자가 다음 %c 입력에 그대로 전달되어 문제가 발생합니다.예제 코드:int main() { int ..
· C
1. 문제 개요C++에서 sizeof 연산자를 사용하면 구조체 크기가 예상한 멤버 크기의 합보다 큰 경우가 많습니다. 이는 메모리 정렬(alignment)과 패딩(padding) 때문입니다. 본 글에서는 이 현상의 원인과 해결 방법을 살펴보겠습니다.2. 메모리 정렬과 패딩의 원리2.1 메모리 정렬이란?메모리 정렬은 CPU가 데이터를 더 효율적으로 읽고 쓰기 위해, 데이터를 특정 바이트 경계에 맞춰 배치하는 방식입니다.예를 들어, 4바이트 정수는 주소가 4의 배수로 정렬되면 CPU가 한 번의 읽기로 데이터를 처리할 수 있습니다.2.2 구조체에서의 패딩구조체의 멤버는 메모리 정렬을 만족하기 위해 사이에 패딩(추가 공간)이 삽입됩니다. 다음은 예시입니다:struct Example { char a; //..
민호이
'C' 카테고리의 글 목록