C언어 12

[C 언어] 포인터(Pointer)의 이해

Intro 많은 사람들이 C 언어를 어려워 하는 가장 큰 이유가 포인터이다. 포인터는 항상 메모리와 연관해서 설명되고 간접 참조하기 때문에 직관적으로 이해되지 않는 경우가 있기 때문이다. 그런데 실무에 들어가서 코딩하다보면 정작 포인터를 많이 안쓰게 되는 경우가 있다. 만드는 프로그램이 단순하거나 포인터의 동작에 대해 자신이 없는 경우 전역 변수로 처리하기 때문이다. 포인터란? 직접 개발을 하면서 깨달은 포인터의 의미를 쉽게 설명해 보려 한다. 포인터는 말 그대로 가르키는 것이다. 복잡하게 생각할 필요가 없다는 뜻이다. 누군가에게 길을 물어본다고 하면 아래 그림처럼 길을 알려주는 사람은 손가락으로 가르킬 것이다. 그럼 물어본 사람은 그 손가락을 따라 시선을 이동하게 되는데 바로 이것이 포인터이다. 무슨 ..

C언어 2023.02.25

[C 언어] 구조체 초기화 방법

지난 글에서는 지역/전역 변수의 초기화 방법에 대해 알아보았다. 오늘은 구조체의 초기화 방법에 대해 알아보려 한다. 구조체도 마찬가지로 지역 변수, 전역 변수, 동적 할당 등에 따라 초기화 방법이 다르다. 1. 전역 변수 / 지역 변수 초기화 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 typedef struct{ int data[SIZE]; int head; int tail; }QUEUE; QUEUE que; int main(void){ QUEUE que2; for(int i = 0; i

C언어 2023.02.06

[C 언어] 변수 초기화에 관해서 (전역, 지역 변수)

일반 변수의 초기화에 대해서는 일반적으로 알고 있는 내용이 많다. 그렇지만 전문적으로 프로그램을 개발하기 위해서는 정확하게 변수의 생성 위치와 초기화 원리를 알고 있는 것이 좋다. 1. 전역 변수 / 지역 변수 초기화 일반적인 변수들을 크게 나누자면 전역 변수와 지역 변수로 나눌 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 int g_arr[10]; int main(void){ int s_arr[10]; for(int i = 0; i

C언어 2023.02.06

[C 언어] Dangling pointer

오늘은 포인터를 사용할 때 마주칠 수 있는 dangling pointer라는 것에 대해 알아보려 한다. Dangling pointer : 유효하지 않은 메모리 영역의 주소를 가지고 있는 포인터 쉽게 말해서 포인터가 가르키는 메모리에 접근했을 때 에러가 발생하는 포인터를 말한다. 1. 지역 변수 return시 발생 1 2 3 4 5 6 7 8 9 10 11 12 13 int* return_arr_pointer(void){ int arr[10]; for(int i = 0; i

C언어 2023.01.28

[C 언어] 연산자 우선순위

모두들 코딩을 배울 때 연산자 우선순위에 대해 들어보거나 배운적이 있을 것이다. 오늘은 다양하고 많은 연산자들이 뒤섞였을 때 정확한 원리로 우선순위를 파악하는 방법에 대해 적어보려고 한다. 1. 연산자 우선순위란? 연산자들이 연속으로 이어졌을 때 어떠한 연산자부터 계산해야 하는지를 나타내는 것이다. 수학에서의 연산자 우선순위는 () >> * / >> + - 위와 같이 괄호가 높고 곱하기 나누기 그리고 + - 연산자 순서로 이루어지는 것이 기본이다. 그렇다면 코드에서는 어떨까? 2. C 코드의 연산자들 먼저 C 코드에서 나타날 수 있는 연산자들이 어떤 것들이 있는지 살펴보자. 연산계열 * / % + - Bit 연산 > & | && || ^ 비교 = == != 대입연산 = += -= *= /= %= &..

C언어 2023.01.26

[C 언어] 비트필드 구조체에 대해 알아보자

설 명절날 시골에 내려와 오늘은 어떤 글을 올릴까 고민을 하다가 비트필드 구조체에 대해 적어보기로 했다. (PC로 코드 검증이 필요 없는 것을 고민하다 나온 결론) IoT 또는 통신 분야 관련된 Firmware를 개발하다보면 data frame이라는 단어를 많이 마주치게 된다. 위의 그림은 BLE data frame중 하나이다. 위 그림은 많은 통신 분야 또는 chip register를 컨트롤할 때 많이 보게 되는데, 일정한 용량 안에 최대한 많은 데이터 의미를 넣기 때문에 bit 단위로 의미를 부여하게 된다. 예를 들어 위 그림에서 LL Ovhd를 코드로 해석할 때 아래와 같은 부분을 사용할 수 있다. 1 2 3 4 5 6 7 int main(void){ unsigned short length; uns..

C언어 2023.01.21

[C 언어] 데이터 타입의 형 변환 (2)

오늘은 데이터 형변환에 관련된 이야기를 추가로 해보려 한다. 먼저 아래 코드를 보자. 1 unsigned short val = -1; cs 이것은 정상일까 에러일까? 정답은 정상코드이다. 개발자의 흔한 오해중 하나가 unsigned 라는 단어를 보면 음수는 절대로 들어갈 수 없다고 생각한다는 것이다. 사실 음수는 변환 과정이 필요한 것 뿐이지 별다른 의미를 품고 있지는 않다. (음수 변환 과정에 대해서는 2의 보수 방법(bit 반전 후 더하기 1) 참조) 따라서 위의 코드는 val에 0xFFFF가 담겨 있는 의미로 해석된다. 그럼 아래 코드를 살펴보자 1 2 unsigned short val = -1; signed short val2 = -1; cs val과 val2 모두 -1이 들어있다. 이 값은 같은..

C언어 2023.01.20

[C 언어] 데이터 타입 2번째

지난번 데이터 타입에 관련된 내용은 사실상 형 변환(타입 변경)에 집중된 내용이었다. 그래서 데이터 타입에 관해 좀 더 집중적으로 적어보고자 이 포스팅을 준비했다. 다소 지루하거나 이미 알고 있는 내용일수도 있으나 꽤 중요한 부분이니 복습한다는 의미로 봐주길 바란다. 1. 정수형 데이터 타입의 종류 C언어에서 정의된 데이터 타입은 아래와 같다. (32bit 기준) type size(byte) min max char 1 0 127 signed char 1 -127 127 unsigned char 1 0 255 signed short 2 -32767 32767 unsigned short 2 0 65535 signed int 4 -2147483647 2147483647 unsigned int 4 0 42949..

C언어 2023.01.14

[C 언어] [배열] 배열 기초

C 언어에서 많이 쓰는 자료구조 중 하나가 바로 배열이다. 모두가 아는 배열에 대한 이야기를 하려는건 아니니 끝까지 잘 읽어보길 추천드린다. 1. 배열 배열이란 같은 자료형의 묶음이라고 보면 된다. 마치 비엔나 소시지 같은 모양이라고 보면 된다. 같은 자료형이 묶여 있기 때문에 시작점을 알면 끝까지 연속적으로 이어져 있는 특징이 있다. 그런데!! 초보자가 많이 실수하는 부분이 여기에 있다. 사진처럼 배열은 비엔나 소시지 묶음으로만 이해하기 때문에 몇가지 문제가 발생하게 된다. 1 2 3 4 5 6 7 8 9 10 11 12 char arr[10]; void print_arr_size(char arr[]){ printf("array size : %d\n", sizeof(arr)); } int main(vo..

C언어 2023.01.13

[C 언어] sizeof 연산자에 대하여

내가 firmware 개발을 처음 했을때 sizeof 연산자에 대해 잘못 알고 사용하여 디버깅을 했던 케이스가 생각나 이 포스팅을 하게 되었다. sizeof에 대해 제대로 알고 있는지 스스로 한번 점검해보는 기회가 되면 좋을 것 같다. 1. sizeof 의 정체 1 2 3 4 int a; printf("%d\n", sizeof(a)); printf("%d\n", sizeof a); cs sizeof를 함수로 잘못 알고 쓰는 사람들이 꽤 많다. 위의 코드에서 sizeof(a)로 사용하는 케이스가 많다보니 기존 코드를 재사용하여 습관적으로 사용하는 사람들은 라이브러리 함수로 오해를 한다. 그러나 sizeof는 ++ -- * 등과 같은 연산자이기 때문에 연산자 우선순위의 법칙에 영향을 받고 위 코드와 같이 (..

C언어 2023.01.11
728x90