Language

Language/C

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,..

Language/C

#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..

Language/C

#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; } 위의 코드처럼 배열의 크기를 변경할 때도 해당 매크로의 정의에서 값만 변경해주면 모두 적용되기 때문에 훨씬 사용..

Language/C

선언(declaration)과 정의(definition)

프로그래밍에서 선언과 정의에 대해서 알아보자. 선언과 정의의 가장 큰 차이는 "메모리를 할당하는가"이다. 즉, 메모리를 할당하지 않고, 대상의 이름만 알려준다면 선언이고, 대상의 메모리가 할당된다면 그것은 정의이다. 다만 혼동하기 쉬운 예로 typedef는 사용자 정의 타입이라고 불리지만, 실제로 메모리 영역상에 올리지는 않기 때문에 정의라고 볼 수는 없다. void main() { int a; int b = 10; } 위의 예에서 int a; 는 선언과 동시에 정의한 것이다. 즉, int 4byte 만의 영역이 메모리 할당되었다는 말이다. 너무 헷갈리는데 선언과 정의가 무엇이며, 각자의 특징에 대해 좀 더 자세히 알아보려고 한다. 선언 컴파일러가 참조할 식별자와 이름을 알린다는 의미이다. 여기서 식별자..

Language/C

구조체

구조체는 서로 다른 타입의 변수들을 한 그룹으로 묶는 방법을 제공한다. 이렇게 함으로써 관련된 데이터를 하나의 단위로 취급할 수 있게 된다. 구조체 메모리 할당 방식 우선 구조체를 시작하면서 구조체의 메모리 할당 방식, 구조체의 크기 계산 방법, 그리고 구조체와 포인터의 상호 작용에 대해서 알아보자. 이 개념을 배우고나면 구조체가 메모리 상에서 어떻게 위치하는지 이해할 수 있고, 메모리를 효츌적으로 활용하는 방법을 배울 수 있다. 또한 이를 통해 프로그램의 성능 향상과 메모리 관리를 위한 기본적인 이해를 갖출 수 있다. 구조체는 메모리 상에서 연속적인 공간에 할당된다. 즉, 구조체를 선언하면 구조체의 모든 멤버가 메모리상에서 순차적으로 위치하게 된다. 이러한 방식은 구조체의 각 멤버에 접근하거나 값을 변..

Language/C

키워드 _CRT_SEUCRE_NO_WARNINGS에 대하여

우리가 c언어로 scanf를 사용하려고 할 때, 비주얼 스튜디오 코드를 사용하면 에러코드 C4996과 함께 오류가 발생하며 빌드가 되지 않는 것을 볼 수 있다. 이때 발생하는 오류가 뭐냐하면 scanf가 안전하지 않으므로 scanf_s를 쓰거나, _CRT_SECURE_NO_WARNINGS를 이용하라는 것이다. 그럼 scanf가 안전하지 않은 이유는 무엇일까? 이는 scanf가 받을 수 있는 입력 데이터의 크기가 있는데 사용자가 고의로 또는 실수로 해당 데이터 크기를 초과하는 값을 입력할 경우, 초과된 데이터가 다른 메모리를 침범해서 프로그램에 오류가 발생할 수 있기 때문에 이를 막기위해 scanf_s로 일정 크기까지만 입력받는 함수를 사용하라고 권장하는 것이다. 그럼 해결 방법을 알아보자. 해결 방법에는..

Language/C

typedef, enum, union

typedef type define의 줄임말로 새로운 type을 define 정의한다. 사용자 정의 타입이라고 불리며, 즉, 기본 자료형을 확장시키는 역할을 하며, 별명을 붙여주는 것으로 이해해도 좋다. 이런 typedef를 사용하면 복잡한 데이터 형식도 새로운 자료형으로 만들 수 있다. 사용법은 아래와 같다. typedef 진짜자료형 별명 예) typedef int INT typedef는 특히 struct 구조체에서 유용하게 사용되는데, 다음의 예시를 이해하면 도움이 될 것이다. #define _CRT_SECURE_NO_WARNINGS #include #include #include struct point { char a; int b; double c; } int main(void) { struct p..

Language/C

컴파일과 디버깅

코드를 컴퓨터가 알아들을 수 있도록 기계어로 변환해야 하는데, 이 과정을 컴파일이라고 한다. 그리고 컴파일을 수행하는 명령은 다음과 같다. $ gcc -g -o hello(실행파일명) hello.c(소스파일명) 또한 자주 사용되는 컴파일 옵션은 다음과 같다. -g : gdb 디버깅 정보 포함 -I : include 경로 -Wall : all warning enable -O : optimization for code ( = -O1 ) 그럼 서론은 여기까지로 하고, 이제 GCC 컴파일러의 개념과 그 확장 개념에 대해서 조금 더 자세히 알아보자. GCC 컴파일러 GCC는 GNU 컴파일 모음(GNU Compiler Collection)의 약자이다. GNU 프로젝트의 일환으로 개발되어서 널리 쓰이고 있는 컴파일러..

Language/C

포인터

데이터의 주소값이란 해당 데이터가 저장된 메모리의 시작 주소를 의미한다. 그리고 C언어에서는 이러한 주소값을 1바이트 크기의 메모리 공간으로 나누어 표현한다. 여기서 알아야할 점은 int형 데이터는 4바이트의 크기를 가지지만 int형 데이터의 주소값은 시작 주소 1바이트만을 가리킨다는 것이다. 그리고 C언어에서 포인터란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부른다. 즉, char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다. int n = 100; // 변수 선언 int *ptr = &n; // 포인터 선언 C언어에서 포인터와 연관되어 사용되는 연산자는 주소 연산자(&), 참조 연산자(*)가 있다. 주소 연산자(&)는 변수의 이름 앞에 사..

Language/python

형 변환

문자열을 정수형으로 변환하는 과정을 형 변환. 즉, type conversion이라고 한다. 파이썬에서는 int('문자열')과 같이 문자열을 전달받아서 10진수 정수형을 얻을 수 있다. 비슷한 예로 float함수는 float('문자열')과 같이 문자열을 전달받고 실행 결과로 실수형을 반환한다. 다음과 같이 2진수, 8진수, 10진수, 16진수를 나타내는 문자열을 각각 정수로 변환할 때는 int(문자열, 진수)와 같이 2개의 인수를 전달받는다. int('17') # 17 int('0b110', 2) # 6 int('0o75', 8) # 61 = 7 * 8 + 5 int('13', 10) # 13 int('0x3F', 16) # 63 float('3.14') # 3.14 참고사항 >>> 는 파이썬의 대화형 ..

kimjingyu
'Language' 카테고리의 글 목록