본문 바로가기

Language/C10

C언어 메모리 조작 (memcpy, memmove) memcpy와 memmove 두 함수는 모두 특정 메모리를 다른 메모리로 복사할 때 사용된다. 이번 포스팅에서는 두 함수의 사용법과 차이점에 대해 알아보자. 두 함수 모두 특정 메모리 주소에서 원하는 크기만큼 다른 곳으로 복사시켜 주고, memory.h 또는 string.h 헤더 파일에 포함되어 있다. 그럼 함수의 반환 타입과 인자값에 대해 조금 더 자세히 알아보자. memcpy void* memcpy (void* dest, void* src, size_t size); dest: 복사되는 메모리의 첫번째 주소 src: 복사할 메모리의 첫번째 주소 size: 복사할 크기 (byte) 반환값: 성공시 dest, 실패시 NULL memmove void* memmove (void* dest, void* src,.. 2023. 11. 16.
#if, #elif, #else, #endif와 #ifdef, #ifndef, #endif 지시문 위 지시문들은 보통 조건부 컴파일 지시자라고 한다. #이 앞에 오는 전처리 지시자이다. 먼저 #if, #elif, #else, #endif부터 알아보면, 일반적으로 우리가 사용하는 if, else if, else와 방식이 유사하다는 것을 알 수 있다. 규칙은 #if를 사용하면 꼭 끝나는 부분에 #endif를 삽입해야 한다는 것을 숙지하자. 왜냐하면, 전처리기는 scope를 사용하지 않아서 꼭 끝을 내줘야 하기 때문이다. 이는 보통 조건부로 코드를 추가 및 제거해서 컴파일할 때 많이 사용한다. #include #define VERSION 3 int main(void) { #if (VERSION == 1) printf("VERSION 1. \n"); #elif (VERSION ==2) printf("VERS.. 2023. 11. 11.
#define에 대해서 #define은 전처리기 지시자로 컴파일하기 전에 실행되는 컴파일러의 한 부분이다. 또한 기호 상수를 만들기 위한 지시자로 보통 매크로라고 한다. 매크로를 정의하는 방법은 다음과 같이 세미콜론을 사용하면 안된다. 이때 보통 매크로 이름은 대문자를 많이 사용한다. 즉, 정의한 매크로를 사용하면 컴파일하기 전에 해당 매크로에 정의한 값으로 변경이 되는 방식이다. #include #define ARRAY_SIZE 10 int main(void) { int num[ARRAY_SIZE]; for (int i = 0; i < ARRAY_SIZE; i++) { num[i] = i; } return 0; } 위의 코드처럼 배열의 크기를 변경할 때도 해당 매크로의 정의에서 값만 변경해주면 모두 적용되기 때문에 훨씬 사용.. 2023. 11. 11.
선언(declaration)과 정의(definition) 프로그래밍에서 선언과 정의에 대해서 알아보자. 선언과 정의의 가장 큰 차이는 "메모리를 할당하는가"이다. 즉, 메모리를 할당하지 않고, 대상의 이름만 알려준다면 선언이고, 대상의 메모리가 할당된다면 그것은 정의이다. 다만 혼동하기 쉬운 예로 typedef는 사용자 정의 타입이라고 불리지만, 실제로 메모리 영역상에 올리지는 않기 때문에 정의라고 볼 수는 없다. void main() { int a; int b = 10; } 위의 예에서 int a; 는 선언과 동시에 정의한 것이다. 즉, int 4byte 만의 영역이 메모리 할당되었다는 말이다. 너무 헷갈리는데 선언과 정의가 무엇이며, 각자의 특징에 대해 좀 더 자세히 알아보려고 한다. 선언 컴파일러가 참조할 식별자와 이름을 알린다는 의미이다. 여기서 식별자.. 2023. 11. 5.
구조체 구조체는 서로 다른 타입의 변수들을 한 그룹으로 묶는 방법을 제공한다. 이렇게 함으로써 관련된 데이터를 하나의 단위로 취급할 수 있게 된다. 구조체 메모리 할당 방식 우선 구조체를 시작하면서 구조체의 메모리 할당 방식, 구조체의 크기 계산 방법, 그리고 구조체와 포인터의 상호 작용에 대해서 알아보자. 이 개념을 배우고나면 구조체가 메모리 상에서 어떻게 위치하는지 이해할 수 있고, 메모리를 효츌적으로 활용하는 방법을 배울 수 있다. 또한 이를 통해 프로그램의 성능 향상과 메모리 관리를 위한 기본적인 이해를 갖출 수 있다. 구조체는 메모리 상에서 연속적인 공간에 할당된다. 즉, 구조체를 선언하면 구조체의 모든 멤버가 메모리상에서 순차적으로 위치하게 된다. 이러한 방식은 구조체의 각 멤버에 접근하거나 값을 변.. 2023. 11. 5.
키워드 _CRT_SEUCRE_NO_WARNINGS에 대하여 우리가 c언어로 scanf를 사용하려고 할 때, 비주얼 스튜디오 코드를 사용하면 에러코드 C4996과 함께 오류가 발생하며 빌드가 되지 않는 것을 볼 수 있다. 이때 발생하는 오류가 뭐냐하면 scanf가 안전하지 않으므로 scanf_s를 쓰거나, _CRT_SECURE_NO_WARNINGS를 이용하라는 것이다. 그럼 scanf가 안전하지 않은 이유는 무엇일까? 이는 scanf가 받을 수 있는 입력 데이터의 크기가 있는데 사용자가 고의로 또는 실수로 해당 데이터 크기를 초과하는 값을 입력할 경우, 초과된 데이터가 다른 메모리를 침범해서 프로그램에 오류가 발생할 수 있기 때문에 이를 막기위해 scanf_s로 일정 크기까지만 입력받는 함수를 사용하라고 권장하는 것이다. 그럼 해결 방법을 알아보자. 해결 방법에는.. 2023. 11. 5.