728x90

메모리 10

[C언어] 메모리 누수(Memory Leak)란?

메모리 누수란 프로그램이 실행되는 동안 동적으로 할당된 메모리(malloc(), calloc(), realloc() 등)를 사용한 후 필요가 없어졌음에도 불구하고 해제하지 않은 경우에 발생한다. 메모리 누수 발생 원인1. malloc()이나 calloc() 같은 함수로 메모리를 할당하고 사용 후 해제(free())하지 않은 경우 메모리 누수가 발생한다.int *arr = (int *)malloc(100 * sizeof(int));// free() 호출이 없어 누수 발생 2. 동적 메모리 할당 후, 해당 메모리를 가리키던 포인터를 덮어쓰거나 변경하면 원래의 메모리 주소에 접근할 수 없게 된다.int *ptr = (int *)malloc(10 * sizeof(int));ptr = NULL; // 할당된 메모..

C언어 2024.10.29

[C언어] 인라인(inline) 함수란?

C99부터 지원하는 inline 함수란 말 그대로 함수 호출을 호출된 자리에서 직접 삽입하는 방식의 최적화 기법이다. 일반적으로 함수를 호출하면 함수의 주소로 이동한 후 실행하고, 완료된 후 다시 원래 위치로 돌아온다. 이러한 과정은 시간적 오버헤드를 수반하며, 이는 특히 자주 호출되는 함수일수록 성능에 악영향을 미칠 수 있다. inline 함수는 이러한 문제를 해결하기 위해, 함수 호출 과정 없이 함수의 코드 자체를 호출 지점에 삽입하는 방식으로 최적화를 수행한다. inline 키워드를 사용한다고 해서 모든 함수가 자동으로 인라인 처리되는 것은 아니다. 컴파일러는 함수의 크기나 복잡성을 고려하여 inline 요청을 무시할 수도 있다. 함수가 너무 커서 인라인 처리 시 코드 크기 증가가 성능 저하로 이어..

C언어 2024.10.21

[C언어] typedef uint8_t BOOL

https://stackoverflow.com/questions/58747149/typedef-uint8-t-t-bool-is-it-still-worth-it typedef uint8_t T_BOOL; Is it still worth it?I am reviewing coding guidelines for C and we still have the guideline to typedef uint8_t for booleans. I work for a company in the automotive industry, therefore doing embedded software and usuallystackoverflow.com스택오버플로우에도 나와있고 직접 직면한 문제에 대해서 얘기해 보자.문제 겸 궁금증은 이 ..

C언어 2024.10.17

[C언어] 댕글링 포인터(Dangling Pointer)란?

댕글링 포인터는 해제된 메모리 영역을 여전히 참조하고 있는 포인터이다. 즉, 이미 해제된 공간을 가리키고 있지만 프로그램 상에서는 여전히 포인터를 사용하려 하기 때문에 문제가 발생한다. 특히 접근 오류(Segmentation Fault)를 유발하거나 보안 취약점의 원인이 되기도 한다. 댕글링 포인터가 발생하는 상황int *ptr = (int *)malloc(sizeof(int));*ptr = 42;free(ptr); // 메모리 해제*ptr = 50; // 이 시점에서 ptr은 댕글링 포인터 댕글링 포인터를 예방하는 방법free(ptr);ptr = NULL;메모리가 해제된 후에는 포인터를 NULL로 설정하는 것이 좋다.free로 해제한 후 ptr을 NULL 바꾸기 전 주소의 값은 초기화되지 않고 그대..

C언어 2024.10.15

[C언어] (void *) 포인터란?

(void *)는 특정 데이터 타입에 제한되지 않은 '일반 포인터'입니다. 보통 포인터는 특정 타입을 가리키지만, void *는 어떤 타입의 메모리든 가리킬 수 있는 일종의 만능 포인터라고 생각하면 됩니다. 쉽게 말하면, 이 포인터는 "난 어떤 타입이든 가리킬 수 있어!"라는 느낌입니다. 이런 특성 덕분에 void *는 다양한 상황에서 유용합니다. 특히 메모리 할당 함수에서 자주 등장합니다. 예를 들어, malloc() 함수는 동적으로 메모리를 할당하는데, 이때 반환값으로 void * 타입을 리턴합니다. 그 이유는, 이 메모리를 어떻게 사용할지에 따라 타입이 달라질 수 있기 때문입니다.int *p = (int *)malloc(sizeof(int) * 10); 위 코드에서 malloc()은 void *를 ..

C언어 2024.10.10

[C언어] memcpy() 함수

memcpy() 함수는 C 프로그래밍 언어에서 메모리 블록을 복사하는 함수이다. 원본 메모리 블록에서 지정한 크기만큼의 데이터를 목적지 메모리 블록으로 그대로 복사할 때 사용된다. 사용법#include void *memcpy(void *dest, const void *src, size_t n); 매개변수dest : 데이터를 복사할 목적지 메모리 블록의 시작 주소이다.src : 복사할 원본 메모리 블록의 시작 주소이다.n : 복사할 바이트 수를 나타낸다.반환값복사된 목적지 메모리 블록의 시작 주소(dest)를 반환한다. 예제1)#include #include int main() { char src[] = "Hello, World!"; char dest[20]; // src 배열의 내용을 d..

C언어 2024.10.10

[C언어] memset() 함수

memset() 함수는 C 프로그래밍 언어 메모리의 특정 영역을 원하는 값으로 초기화(세팅)할 때 사용되는 함수이다.이 함수는 동적 메모리 할당이 아닌 정적 메모리 할당 또는 자동 메모리 할당이라고 부른다.함수의 이름 보면 뜻을 알 수 있다. memory + setting 메모리를 특정 값으로 세팅한다. 사용법#include void * memset(void* ptr, int value, size_t num); 매개변수ptr : 초기화할 메모리의 시작 주소이다.value : 메모리에 설정한 값이고, unsigned char로 변환되어 사용된다. 0~255 사이의 값을 넣으면 된다.num : 초기화할 바이트 수이다. 메모리에서 몇 바이트를 이 값으로 채울지 지정한다.반환값초기화된 메모리의 포인터를 반환한다..

C언어 2024.10.10

[C언어] realloc() 함수

realloc() 함수는 C 프로그래밍 언어에서 동적 메모리를 할당하기 위해 사용되는 함수이다. 이 함수는 표준 라이브러리  에 정의되어 있다. C언어에서 동적으로 할당한 메모리는 free함수를 이용하여 부분적으로 해제할 수 없다. 대신 realloc 함수를 이용하여 할당한 메모리의 크기를 조절할 수 있다. 사용법#include void* realloc(void* ptr, size_t new_size); 매개변수 ptr : 크기를 변경할 기존 메모리 블록의 포인터이다. 만약 이 값이 NULL이면, realloc은 malloc과 같은 방식으로 새로운 메모리 블록을 할당한다.new_size : 새로 요청하는 메모리 블록의 크기(바이트 단위)이다.기능크기 조정: 현재 할당된 메모리 블록의 크기를 new_siz..

C언어 2024.10.08

[C언어] calloc() 함수

calloc() 함수는 C 프로그래밍 언어에서 동적 메모리를 할당하기 위해 사용되는 함수이다. 이 함수는 표준 라이브러리 에 정의되어 있다.  사용법#include void* calloc(size_t num, size_t size); 매개변수num : 할당할 요소의 개수이다.size : 각 요소의 크기(바이트 단위)이다.기능 calloc은 num개의 요소를 각 size바이트 크기로 할당하여, 총 num * size 바이트의 메모리를 요청한다.할당된 메모리의 모든 바이트는 0으로 초기화된다.반환값성공적으로 메모리를 할당하면, 할당된 메모리 블록의 포인터를 반환한다.메모리 할당에 실패하면 NULL을 반환한다. calloc는 malloc과 다르게 메모리를 할당하며 0으로 초기화한다. 메모리 해제#includ..

C언어 2024.10.08

[C언어] malloc() 함수

malloc() 함수는 C 프로그래밍 언어에서 동적 메모리를 할당하기 위해 사용되는 함수이다. 이 함수는 표준 라이브러리 에 정의되어 있다. 메모리 동적 할당이란메모리 동적 할당(Dynamic Memory Allocation)은 프로그램 실행 중에 필요한 메모리를 요청하고 할당받는 과정을 의미한다.이 방식은 프로그램이 시작될 때 고정된 크기의 메모리를 미리 할당하는 정적 할당과는 달리. 실행 중에 필요에 따라 메모리를  동적으로 요청하고 해제할 수 있다. 사용법#include void* malloc(size_t size) 매개변수 size : 할당한 메모리의 크기(바이트 단위)를 지정한다.반환값성공적으로 메모리를 할당하면, malloc은 해당 메모리 블록의 포인터를 반환한다.메모리 할당에 실패하면 NUL..

C언어 2024.10.08
728x90