프로그래밍 언어 50

C언어의 static 변수

C언어를 하다가 보면 static이 앞에 붙은 변수들이 있을 것이다. 이것들은 왜 있으며, 어떻게 사용하는 것일까? 메모리 구조 일단은 운영체제에서 제공하는 메모리 영역을 살펴보자. 크게 보면은 코드 영역, 데이터 영역, 힙 영역, 스택 영역 이렇게 총 4가지로 구분이 된다. 아래의 그림은 메모리 구조를 도식화 한 것이다. 프로그램의 코드들은 코드 영역에 들어간다. CPU는 여기 저장된 명령어를 알아서 처리하게 된다. 데이터 영역은 전역 변수 및 정적 변수 (static)가 들어가게 된다. 이곳은 프로그램의 시작과 동시에 할당되고, 프로그램이 종료됨과 동시에 소멸한다. 전역 변수와 정적 변수는 할당과 동시에 0 또는 NULL로 초기화 되는 특징이 있다. 스택 영역은 지역 변수와 매개변수가 저장되는 영역이..

size_t 는 무엇일까?

c프로그래밍을 하다 보면은 종종 size_t 와 같은 자료형을 볼 수 있을 것이다. c를 배운 사람이라면 int, double, long, float 등의 자료형은 흔히 봐 왔을 것이다. 하지만 size_t, ssize_t 등의 자료형도 가끔식 보인다. 이러한 자료형은 왜 있는 것일까? 동작 환경에 따른 차이 현재 대부분의 x86 컴퓨터는 32비트 또는 64비트 운영체제를 사용하고 있다. 요즘은 ARM에서도 64비트를 사용 중이다. c언어의 변수의 크기는 구동 환경에 따라 다르다. 보편적인 경우에 int형의 크기는 4바이트 (32비트)라고 알 것이다. 이는 32비트의 환경에서만 적용된다. 즉, 대부분의 변수는 동작 환경에 따라 크기가 달라진다. 하지만 size_t 의 경우에는 다르다. 보통 헤더 파일에 ..

C언어 메모리 누수 확인하기

C언어가 다른 프로그래밍 언어에 비해서 가지는 장점은 속도와 메모리 접근성일 것이다. C는 역사가 오래된 언어이기 때문에 기계어랑 가까운 편에 속하고 실행 속도도 빠르다. 무엇보다 메모리에 직접 접근이 가능한 장점 덕분에 임베디드 시스템에서도 오랫동안 자리를 차지한 언어이다. 하지만 C언어는 다른 언어에 비해 복잡하고, 메모리 누수를 막지 못하면 프로그램의 효율이 떨어지는 단점을 가지고 있다. C로 프로그램을 작성하고 나서 메모리 누수가 나면 매우 안타깝다. 이럴 때 간단하게 메모리 누수를 확인하는 Tool이 있다. 1. (MAC 한정) leaks leaks [PID] 를 이용하면은 현재 메모리 누수가 얼마나 있는지 확인이 가능하다. 하지만 정확도가 낮은 편이고, 맥 에서만 지원되는 프로그램이기에 간단히..

깃허브 커밋 시 윈도우, 맥 줄바꿈 문자 에러 해결하기

최근에 42서울을 진행하며 클러스터와 집을 번갈아가면서 코딩을 진행했다. 하지만 norm 에서 자꾸 막힌다. 에러 메시지를 보니 자꾸 42헤더 부분에서 뭔가 문제가 있는 것 같다. 별 짓거리를 다 해봐도 그자리에선 해결이 안되어서 결국 다시 코딩했다....뺨에 흐르는건 눈물인가? 여튼 고생좀 했다. 원인을 알아보기 위해서 이것저것 알아보던 중, PC 운영체제마다 줄바꿈 문자가 다르다는 것을 알게 되었다. 추측컨대, 윈도우에서 작업한 줄바꿈이 맥에서 작동하지 않는 것 같다. 각 운영체제마다 줄바꿈 문자가 다르다는 것을 알게 되었으니, 개행문자에 대해서 잠깐 정리해 보자. 개행문자는 줄바꿈문자 라고도 말한다. 두개가 있는데 하나는 LF (Line Feed, ascii : 10, \n) 이고 커서를 한칸 아래..

파이썬 문자열 관련 함수 정리하기

문자열 처리에 대한 알고리즘은 양이 너무 방대하다. 문자열을 파싱하는 것은 각 상황마다 알맞은 알고리즘을 생각해야 하기 때문이다. 나도 문자열 알고리즘에 매우 취약한 편이라서 아예 이번에 문자열 처리 메소드 및 관련 내용에 관한 내용을 정리하는 것이 좋겠다고 생각했다. C는 속도는 빠르지만 문자열 처리가 복잡하므로 되도록 파이썬으로 문자열 처리를 해보기로 했다. C로 처리할 일이 곧 많이 생기겠지만 ㅠㅜ (C는 문자열을 포인터 연산으로 처리하는것이 가장 좋다.) 1. 문자열 계산하기 len(str) : 문자열 길이를 반환 max(str), min(str) : 문자열 내 문자의 최소/최대 값 반환 (숫자 오름차순 > 알파벳 오름차순) str.count(finds) : str 문자열 내 finds랑 일치하는..

vim 에디터 간단히 사용하기

리눅스 쉘은 그래픽 인터페이스가 아닌, 텍스트로만 이루어져 있다. 리눅스를 사용하게 되면은 그래픽 유저 인터페이스(Graphic User Interface) 보다는 텍스트 유저 인터페이스(Text User Interface)를 더 많이 보게 될 것이다. 여기서 텍스트 파일을 수정하기 위한 에디터는 주로 2가지가 있다. Nano 하고 Vim 이 있다. 전자는 간단한 기능만 있고, 후자는 다양한 기능 및 추가 기능이 있다. Vim은 알아두면 좋은 기능들이 많지만, 모든 기능을 알기는 시간이 좀 걸린다. 주로 쓰는 기능들을 익혀서 빨리 사용해 보자. vim의 구조 텍스트 편집을 할 때 크게 3가지 모드로 구분된다. 1. 입력 모드 vim을 킨 후 i를 누르면 현재 커서부터 입력이 가능해진다. 2. 명령 모드 ..

줄넘김 문자 endl , \n 차이

줄넘김 문자를 출력할 때 c++에서는 endl 과 \n 의 두 가지 선택지가 있다. 둘 중 무엇이 더 빨리 출력이 될까? 정답은 \n이다. 왜냐하면 std 내부에 정의되어 있는 endl을 보면 다음과 같다. 1 2 3 4 5 6 basic_ostream& __CLRCALL_OR_CDECL endl( basic_ostream& _Ostr) { // insert newline and flush stream _Ostr.put(_Ostr.widen('\n')); _Ostr.flush(); return _Ostr; } Colored by Color Scripter cs 마지막에 보면 flush() 함수가 있다. 간단히 말하면, 버퍼를 비우는 동작이 endl 안에 포함되어 있기 때문에, 시간이 느린 것이다. 알고리..

gcc 를 이용해 c언어 간단히 컴파일하기

C언어를 처음 접하게 되면 대부분 윈도우의 비주얼 스튜디오 또는 VScode로 시작할 것이다. 여기서는 컴파일 버튼이 기본적으로 탑재되어 있어 편하게 코드 관리와 컴파일을 할 수가 있다. 이와 비슷하게 리눅스 터미널에서도 컴파일을 할 수가 있다. gcc 라는 프로그램인데, 예전부터 계속 사용되었던 프로그램이다. 빠르게 실행파일 만들기 프로그램 컴파일의 과정을 정말로 간략히 설명하면, .c로 끝나는 파일들을 .o로 만들어 목적 파일들을 만든다. 마지막으로 .o 파일들(라이브러리 파일이 있으면 그들도 포함) 을 실행 파일로 만들게 된다. c 파일이 한개이고, 빠르게 결과를 보고 싶을 때는 다음과 같은 명령어를 작성한다. gcc "c파일이름" / gcc -o "실행파일이름" "c파일이름" 왼쪽 명령어를 입력하..

Windows 10 에서 리눅스 사용하기 (WSL, 리눅스 윈도우 하위시스템)

PC의 운영체제는 거의 3개로 나누어진다. Microsoft 사의 Windows, Apple의 Mac OS, 그리고 리눅스이다. Mac OS 는 애플의 제품에서만 정식으로 지원되니, 하드웨어를 본인의 입맛에 맞게 구성한 후 사용할 수 있는 운영체제는 Windows 와 리눅스라고 할 수 있다. 대부분의 경우에는 한 개의 컴퓨터에 한 개의 운영체제를사용한다. 하지만 윈도우 컴퓨터에서도 리눅스를 듀얼부팅 없이 바로 사용이 가능하게 되어 있다. wsl이라는 기능을 이용하면 복잡한 과정 없이 바로 리눅스 실행이 가능하다. WSL 설치하기 OS : 윈도우10 최신버전, 64비트 1. Windows 기능 켜기/끄기 -> Linux용 Windows 하위 시스템 체크 기본적으로 켜져 있는 기능은 아니기 때문에 이 기능을..

main 함수에 입력 변수 설정하기

C언어를 이용해 코드를 짜다 보면은 특정 기능을 함수 또는 클래스로 구분하여 작성을 하게 된다. 함수는 입력 변수가 있기도 하고, 없기도 한다. main 함수도 똑같은 함수인데, 입력 변수가 있을까? 답은 "있다" 이다. 이에 대한 작성법을 알아보자. main 함수의 입력변수 main 함수의 레퍼런스를 확인해 보자. en.cppreference.com/w/cpp/language/main_function Main function - cppreference.com A program shall contain a global function named main, which is the designated start of the program. It shall have one of the following for..