전체 글 50

컴파일 과정

! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.1. 전처리우리가 알고 있는 그 전처리 맞음#define 뿐만 아니라 #include, #param, #ifdef 등 앞에 #붙인 모든게 전처리 대상임#include #define PI 3.14int main(void) { printf("%.2f\n", PI); // PI == 3.14 return 0;}gcc -E preprocess_before.c -o preprocess_after.c아래에는 PI에 3.14가 들어갔을 뿐만 아니라 주석도 지워짐int main(void) { printf("%.2f\n", 3.14); return 0;}실제로는 헤더파일 내용이 위에 추가로 들어가 있음stdio.h ..

리눅스 권한

! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.1. 권한권한(permission)은 보안을 위해 어떤 행위자가 어떤 행위를 할 수 있는지 제한하는 것이다. daehun 유저가 작성한 텍스트 파일은 daehun 유저만 읽을 수 있게 허가하고, 나머지 유저는 못 읽게 하는 것이 그 예이다.1.1. 권한의 종류행위 : 읽기(read), 쓰기(write), 실행(execute)행위자 : root, user, group, other/guest! root 계정은 소유주/소유 그룹이 아니더라도 모든 파일에 대해서 접근이 가능하다.2. ls -lls -l 명령어를 입력하면 아래와 같이 나옴주황색 : 권한 → 3개씩 끊어서 묶음으로 나타낼 수 있음 rwx/rwx/rwxr(read),..

동적 할당

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.동적할당 사용 이유와 방법 대해 이해한다.동적할당 원리에 대해 간단히 이해한다.1. 동적 할당 사용 이유고객 100명의 나이를 배열에 저장해야하면 아래와 같이 코드를 작성할 수 있을 것이다. 하지만 값(100)보다 사람이 적다면 저장 공간이 낭비될것이고, 사람이 더 많아진다면 값을 늘려 컴파일 해야할 것이다. 만약 상용 프로그램이였다면 코드가 크니 컴파일 시간도 오래 걸릴것이고 배포도 해야하니 문제가 있다. 따라서 입력한 값 만큼 배열의 크기를 정할 수 있는 동적할당을 사용한다.#include int main(void) { int age[100]; return 0;}2. malloc동적할당을 할 수 있..

구조체

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정학한 내용이 있을 수 있으니 양해바랍니다.구조체의 사용 방법을 학습한다.1. 구조체구조체는 관련된 변수를 하나의 자료형으로 만들어 보관하는 것이다. 예를 들어 사람의 정보인 이름, 나이, 학과를 저장할 때 모두 다른 변수로 저장해도 되지만 묶어서 저장하면 더욱 효율적이다. 아래 코드는 구조체를 선언하는 방법이다. 구조체 명으로는 흔히 Pascal case로 맨앞글자만 대문자로 작성한다.struct 구조체명 { 자료형 변수명; ... 자료형 변수명;};struct Info { char name[20]; int age; char major[20];};2. 구조체 변수 선언만들어진 구조체 사용하여 변수를 선언해보겠다. 아래 코..

문자열 함수

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정학한 내용이 있을 수 있으니 양해바랍니다.다양한 문자열 처리 함수에 대해 이해한다.secure 함수에 대해 이해한다.1. 문자열 함수Python과 달리 C언어에서 문자열 다루기는 매우 쉽지 않다. 문자열을 다루는 함수는 string.h 헤더파일에 있으며 함수 문법과 해당 함수에서 나타날수 있는 취약점에 대해서 알아보고자 한다.1.1. strlenstrlen(String length)는 문자열의 길이를 알기위한 함수이다. 문자열의 길이를 반환합니다.인자 : 변수 혹은 상수 문자열size_t strlen(const char *__s)#include #include int main() { char str[100] = "Hello world"; pr..

함수

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.함수의 정의(입력값을 넣으면 결과를 반환)을 이해한다.call-by-value와 call-by-reference의 차이를 이해한다.지역 변수와 전역 변수의 차이점을 학습한다.1. 함수의 정의수학에서의 함수는 y = f(x)로 x값이 주어지면 연산을 통해 y값이 나오는것이다. 코딩에서도 마찬가지로 input이 주어지면 일련의 연산결과를 통해 output이 나오게된다. printf()함수에서 서식 문자와 변수라는 input을 넣으면 출력이라는 output이 나오는것과 마찬가지이다. 추가로 printf()함수는 사용자 지정함수가 아니라 내장 함수이기 때문에 stdio.h 헤더 파일에 존재한다.코딩에서의 함수는 inpu..

배열과 포인터

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정학한 내용이 있을 수 있으니 양해바랍니다.배열과 포인터의 관계를 알아본다.printf와 scanf의 인자에 대해 이해한다.OOB 취약점에 대해 이해한다.1. 1차원 배열의 구조아래 코드는 1Byte 자료형인 문자 자료형을 4개만큼 선언했을 때 그 주소를 출력한다. &arr[0]은 arr[0]번째의 주소를 출력한다. 하지만 arr에 주소를 출력하는 &를 출력하지 않아도 &arr[0]와 같은 주소가 출력한다. 이는 arr 그 자체로 주소이며 arr 배열의 첫번째 인덱스를 가르친다는 의미이다. 또한 &arr[0]과 &arr[1]이 1Byte 간격으로 변수가 할당 되어있음을 확인할 수 있다.#include int main(void) { char arr..

포인터

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.포인터의 정의에 대해 이해한다.Little endian을 이해한다.1. 포인터의 정의C언어를 공부할 때 포인터는 매우 중요한 개념이라는건 알지만 어려워서 코딩을 포기하는 경우가 종종있다. 하지만 포인터의 정의는 굉장히 쉽다. 포인터의 정의는 ‘변수의 주소를 저장하는 변수’이다. 더 이상의 추가적인 정의는 필요없다. 변수도 메모리에 저장되게 될텐데 그 주소를 저장한게 포인터이다. 집주소로 예시를 들자면 변수 num의 집주소가 10호 일때 10을 저장하는 공간이 포인터인것이다.변수 앞에 &을 붙이면 변수의 주소이다. 아래 코드에서 num의 주소는 0x16d423438이라고 되어있는데 이 주소를 ptr에 저장한다. 이..

배열

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.배열의 사용법을 이해한다.인덱스(index)를 이해한다.출력의 원리를 알아본다.1. 배열배열은 같은 데이터 형식을 저장한 형태이다. 배열의 사용 방법은 아래와 같다.1. 데이터 타입 배열명[배열 크기]; // 값이 쓰레기값으로 초기화 됨2. 데이터 타입 배열명[배열 크기] = {}; // 값이 0으로 초기화 됨2. 데이터 타입 배열명[배열 크기] = {값1, 값2, ...}; // 값으로 초기화 후 남은 공간은 0으로 초기화 됨5개의 나이를 저장해야한다고 가정해보자. 여태껏 작성했던 방식으로는 아래처럼 작성할 수 있다. 하지만 이는 코드가 늘어날 뿐만 아니라 5개의 변수를 출력하기 위해서 모든 변수를 불러야한다...