Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 프로그래밍

  1. C 언어의 중첩 함수(Nested Function), 왜 지원되지 않을까?

    일부 프로그램에서는 어떤 함수의 내부에 또 다른 함수가 선언된 형태를 볼 수 있습니다. 이를 흔히 중첩 함수(nested function)라고 부르지만, 엄밀히 말하면 이것은 진정한 의미의 중첩 함수가 아닙니다. 이러한 구조는 어휘적 범위(lexical scoping)라고 하며, C 언어에서는 유효하지 않습니다.그 이유는 C 컴파일러가 내부 함수의 올바른 메모리 위치에 접근할 수 없기 때문입니다. 또한 중첩 함수 정의는 바깥 블록의 지역 변수에는 접근할 수 없고, 오직 전역 변수만 사용할 수 있습니다. C 언어에는 지역(local)

  2. C/C++ 매개변수 전달 방식 3가지 총정리: 값 호출, 주소 호출, 참조 호출

    C 언어에서는 함수에 매개변수를 전달하는 방법이 크게 두 가지 있습니다. 바로 값에 의한 호출(Call by Value)과 주소에 의한 호출(Call by Address)입니다. 여기에 C++에서는 한 가지 기법이 더 추가되는데, 바로 참조에 의한 호출(Call by Reference)입니다. 이번 글에서는 이 세 가지 방식이 각각 어떻게 동작하며, 어떤 차이가 있는지 예제 코드를 통해 자세히 살펴보겠습니다.1. 값에 의한 호출 (Call by Value)값에 의한 호출은 가장 기본적인 매개변수 전달 방식입니다. 이 방식에서는 함수

  3. C/C++ 메모리 누수(Memory Leak)란 무엇인가? 원인과 예제 코드로 완벽 이해

    메모리 누수(memory leak)는 프로그래머가 힙(heap) 영역에 동적으로 할당한 메모리를 프로그램에서 더 이상 사용하지 않게 된 후에도 적절히 해제(deallocate)하지 않을 때 발생하는 문제입니다. 해제되지 않은 메모리는 아무 용도 없이 계속 점유된 상태로 남기 때문에 누수라고 부릅니다.메모리 누수가 문제가 되는 이유메모리 누수가 발생하면 일부 메모리 블록이 낭비됩니다. 시스템에 여유 메모리가 충분하더라도 누수가 반복되면 사용 가능한 메모리가 점점 줄어들어 프로그램 성능 저하를 유발하고, 심한 경우 장시간 실행되는 서버

  4. C언어에서 변수의 메모리 표현을 출력하는 방법

    이번 글에서는 C언어에서 변수가 메모리에 어떤 형태로 저장되어 있는지, 즉 메모리 표현을 직접 출력해 보는 방법을 알아보겠습니다. 정수(int), 실수(float), 그리고 포인터(pointer) 세 가지 자료형을 예로 들어 설명합니다.구현 원리변수의 메모리 내용을 바이트 단위로 확인하려면 다음과 같은 순서로 진행합니다.출력할 변수의 주소와 크기(sizeof)를 구합니다.해당 주소를 unsigned char* 타입으로 캐스팅하여 바이트 단위로 접근할 수 있게 만듭니다.변수의 크기만큼 반복문을 돌면서 캐스팅된 포인터가 가리키는 각 바

  5. C 언어에서 자체 sizeof 매크로 구현하기

    C 언어에서 sizeof 연산자를 직접 구현하려면 포인터 산술(pointer arithmetic)을 활용할 수 있습니다. 변수 x가 있을 때 &x는 해당 변수의 메모리 주소를 가리킵니다. 여기서 &x + 1은 단순히 주소 값에 1을 더하는 것이 아니라, x의 데이터 타입 크기만큼 주소를 증가시킵니다.즉, x가 char 타입이라면 주소가 1바이트만큼 증가하고, int나 float 타입이라면 4바이트만큼 증가합니다. 따라서 (&x + 1)과 &x의 차이를 계산하면 x의 실제 크기를 구할 수 있습니다.매크로를

  6. C 언어로 부동 소수점 숫자의 세트 비트 개수 구하는 방법

    이 문제에서는 하나의 부동 소수점 값이 주어지며, 해당 값의 이진 표현에서 세트 비트(set bit, 즉 1로 설정된 비트)가 몇 개인지 구해야 합니다.예를 들어 부동 소수점 수가 0.15625라면 세트 비트는 총 6개입니다. 일반적인 C 컴파일러는 단정밀도(single precision) 부동 소수점 방식을 사용하므로, 이 값은 메모리에 다음과 같이 저장됩니다.접근 방법부동 소수점 숫자의 실제 비트 값을 확인하려면 다음 과정을 거칩니다.1. 해당 숫자의 주소를 포인터 변수에 담습니다.2. 포인터를 char* 타입으로 캐스팅합니다.

  7. C언어에서 putchar() 함수만으로 long int 값 출력하는 방법

    C언어에서는 printf()를 사용하면 변수의 값을 손쉽게 출력할 수 있습니다. 하지만 이번 글에서는 putchar() 함수 하나만을 사용하여 long int 타입의 값을 출력하는 방법을 알아보겠습니다.putchar()는 이름 그대로 단일 문자(character)만 출력할 수 있는 함수입니다. 따라서 숫자를 출력하려면 숫자를 한 자리씩 분리한 뒤, 각 자릿수를 문자로 변환하여 출력해야 합니다.숫자를 문자로 변환하는 원리핵심은 아스키(ASCII) 코드에 있습니다. 문자 0의 아스키 코드 값은 48이며, 숫자 0~9는 이 값으로부터 연

  8. main() 함수 없이 실행되는 C 프로그램 작성하는 방법

    main() 함수 없이 C 프로그램을 작성하는 것이 가능할까요? 정답은 가능하다입니다. 이 글에서는 main() 함수가 전혀 없는 상태로 실행되는 C 프로그램을 만드는 방법을 살펴보겠습니다.일반적으로 main() 함수는 프로그램 실행의 시작점(entry point)이라고 알려져 있습니다. 하지만 이것은 어디까지나 프로그래머의 관점에서만 사실입니다. 시스템의 관점에서 보면 이야기가 다릅니다.프로그램의 실제 시작점: _start()실제로 운영체제는 프로그램을 실행할 때 가장 먼저 _start() 함수를 호출합니다. 이 함수는 프로그램

  9. C 언어로 직접 구현하는 memcpy() 함수 완벽 가이드

    이번 글에서는 C 언어로 memcpy() 함수를 직접 구현하는 방법을 알아보겠습니다. memcpy()는 표준 라이브러리(string.h)에 포함된 함수로, 한 메모리 위치에서 다른 위치로 데이터 블록을 복사하는 역할을 합니다. 기본 문법은 다음과 같습니다.void * memcpy(void *dest, const void *src, size_t num);각 매개변수의 의미는 다음과 같습니다.- dest: 데이터가 복사될 목적지 메모리 주소- src: 복사할 데이터가 있는 원본 메모리 주소- num: 복사할 바이트 수구현 원리자체 me

  10. C 언어에서 bool 타입 구현하고 사용하는 방법

    C 언어에는 bool이라는 사전 정의된 데이터 타입이 없습니다. 하지만 enum(열거형)을 활용하면 bool 타입을 직접 만들어 사용할 수 있습니다.열거형으로 bool을 정의할 때는 false와 true를 요소로 넣습니다. 이때 false가 첫 번째 위치에 있으므로 값 0을 가지고, true는 두 번째 위치에 있으므로 값 1을 가지게 됩니다. 이렇게 정의한 열거형은 일반 데이터 타입처럼 변수 선언에 사용할 수 있습니다.예제 코드#include<stdio.h>typedef enum {   &nbs

  11. C 프로그래밍의 숨겨진 흥미로운 사실들

    C 언어는 오랜 역사만큼이나 의외의 동작과 잘 알려지지 않은 문법적 특징들을 많이 가지고 있습니다. 이번 글에서는 일상적인 코딩에서는 잘 접하지 못하지만, 표준 C 규격 안에서 실제로 동작하는 재미있는 사실들을 코드 예제와 함께 살펴보겠습니다. 1. switch 문의 case 라벨이 if-else 문 안에 들어갈 수 있다 case 라벨은 단순히 점프 지점을 표시하는 라벨일 뿐이기 때문에, switch 블록 내부라면 if-else 문 안에 위치할 수도 있습니다. 컴파일러는 case 키워드 자체를 일반 라벨처럼 처리합니다. 예제 #

  12. C/C++의 nextafter() 및 nexttoward() 함수 완벽 가이드

    이번 글에서는 C/C++에서 제공하는 nextafter()와 nexttoward() 함수가 어떤 역할을 하는지 자세히 살펴보겠습니다. 두 함수 모두 <math.h>(C) 또는 <cmath>(C++) 헤더 파일에 정의되어 있습니다. nextafter()와 nexttoward()란? nextafter(a, b) 형태로 호출하면, 첫 번째 인자 a를 기준으로 두 번째 인자 b 방향에 위치한 표현 가능(representable)한 바로 다음 부동소수점 값을 반환합니다. 예를 들어 nextafter(0.0, 1.0)은

  13. C 언어 pthread_cancel() 함수로 특정 스레드 취소하는 방법

    pthread_cancel() 함수는 스레드 ID를 기반으로 특정 스레드를 취소할 때 사용됩니다. 이 함수는 대상 스레드에 취소 요청(cancellation request)을 전송하여 해당 스레드의 종료를 유도합니다.함수 문법int pthread_cancel(pthread_t th);매개변수 th에는 취소하고자 하는 스레드의 ID가 전달됩니다. 함수 호출이 성공하면 0을 반환하고, 실패하면 오류 번호(error number)를 반환합니다.그럼 실제 예제를 통해 이 함수로 스레드를 취소하는 방법을 살펴보겠습니다.예제 코드#includ

  14. C 언어의 pthread_equal() 함수 – 두 스레드가 같은지 비교하는 방법

    C 언어의 pthread_equal() 함수는 POSIX 스레드(pthread) 환경에서 두 스레드가 서로 동일한지 확인할 때 사용하는 함수입니다. 이 함수는 0 또는 0이 아닌 값을 반환하는데, 두 스레드가 같으면 0이 아닌 값(참)을 반환하고, 다르면 0을 반환합니다.함수 문법int pthread_equal(pthread_t th1, pthread_t th2);여기서 th1과 th2는 비교하고자 하는 두 스레드의 식별자입니다. 참고로 pthread_t 타입은 내부 구조가 시스템마다 다를 수 있으므로, == 연산자로 직접 비교하지

  15. C 언어의 pthread_self() 함수 – 현재 스레드 ID 확인하기

    C 언어에서 pthread_self() 함수란? 이 글에서는 C 언어에서 pthread_self() 함수가 어떤 역할을 하는지 자세히 살펴보겠습니다. pthread_self()는 호출한 시점의 현재 스레드 ID를 가져오는 함수입니다. 이 함수를 사용하면 현재 존재하는 스레드를 고유하게 식별할 수 있습니다. 단, 한 가지 주의할 점이 있습니다. 여러 스레드가 동작하는 환경에서 어떤 스레드가 종료되면, 해당 스레드가 사용하던 ID는 이후 새로 생성되는 스레드에게 재사용될 수 있습니다. 즉, 스레드 ID의 고유성은 현재 실행 중인 스레드

  16. C 언어에서 fork()와 exec() 시스템 콜의 차이점 완벽 이해하기

    이번 글에서는 C 언어에서 fork()와 exec() 시스템 콜이 어떤 역할을 하는지, 그리고 두 함수의 핵심적인 차이점은 무엇인지 자세히 살펴보겠습니다.fork()란 무엇인가?fork()는 호출한 프로세스를 복제하여 새로운 프로세스를 생성하는 시스템 콜입니다. 새로 생성된 프로세스를 자식 프로세스(child process)라고 부르며, 원래의 프로세스는 부모 프로세스(parent process)가 됩니다. 자식 프로세스는 다음과 같은 특성을 가집니다.자식 프로세스는 고유한 프로세스 ID(PID)를 가집니다.자식 프로세스의 부모 프

  17. C와 C++ 간의 비호환성: C 코드가 C++에서 컴파일되지 않는 이유

    C는 C++의 기반이 된 언어이지만, 두 언어가 완전히 호환되는 것은 아닙니다. C 컴파일러에서는 정상적으로 컴파일되던 코드가 C++ 컴파일러에서는 오류를 발생시키는 경우가 있습니다. 이 글에서는 C와 C++ 사이의 대표적인 비호환성 사례들을 살펴보고, 각각이 왜 다르게 동작하는지 알아보겠습니다.1. 구식 함수 정의 방식 (K&R 스타일)구식 C 문법에서는 매개변수 목록 뒤에 매개변수의 타입을 별도로 지정하는 방식으로 함수를 정의할 수 있었습니다. 하지만 이 방식은 C++에서 유효하지 않습니다.예제 코드#include<stdi

  18. C 언어의 위생적 매크로(Hygienic Macro), 식별자 캡처 문제 해결법

    이 글에서는 C 언어의 위생적 매크로(Hygienic Macro)에 대해 알아보겠습니다. C에서 매크로의 활용법은 널리 알려져 있지만, 때로는 식별자가 우연히 캡처되는 문제(accidental capture of identifiers) 때문에 의도한 대로 동작하지 않는 경우가 발생합니다.다음 예제 코드를 살펴보면 매크로가 제대로 작동하지 않는 것을 확인할 수 있습니다.문제 상황 예제#include<stdio.h>#define INCREMENT(i) do { int a = 0; ++i; } while(0)main(void)

  19. C/C++ 기본 데이터 타입과 파생 데이터 타입의 차이점 총정리

    C나 C++ 프로그래밍 언어를 배우다 보면 기본 데이터 타입(Fundamental Datatypes)과 파생 데이터 타입(Derived Datatypes)의 개념을 반드시 이해해야 합니다. 이 두 가지는 변수를 선언하고 메모리를 관리하는 방식에서 근본적인 차이를 보이기 때문입니다.기본 데이터 타입 vs 파생 데이터 타입 비교표기본 데이터 타입파생 데이터 타입원시 데이터 타입(Primitive Datatypes)이라고도 불립니다.기본 데이터 타입들을 조합하여 만들어집니다.int, char, float, void 등이 대표적입니다.배열

  20. C 언어의 FILE 데이터 타입이란? 내부 구조와 사용법 총정리

    C 언어에서 파일을 다룰 때 우리는 FILE이라는 데이터 타입의 포인터를 사용합니다. 즉, FILE은 하나의 데이터 타입인데, 이를 불투명(Opaque) 데이터 타입이라고 부릅니다. 불투명 타입이란 내부 구현이 외부에 숨겨져 있어 사용자가 직접 접근할 수 없는 타입을 의미합니다.FILE 타입의 실제 정의는 운영체제나 시스템마다 다릅니다. 표준 라이브러리는 FILE의 내부 구조를 감추고, fopen(), fread(), fclose() 같은 함수들을 통해서만 파일을 조작하도록 설계되어 있기 때문입니다. 참고로 Ubuntu(Linux)

Total 1443 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:17/73  20-컴퓨터/Page Goto:1 11 12 13 14 15 16 17 18 19 20 21 22 23