초보 해커를 위한 C언어와 동작 원리/Ch2. Programming 16

동적 할당

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.동적할당 사용 이유와 방법 대해 이해한다.동적할당 원리에 대해 간단히 이해한다.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개의 변수를 출력하기 위해서 모든 변수를 불러야한다...

난수

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.코딩에서의 난수 정의를 이해한다.랜덤 함수들을 알아본다. 1. 난수우리가 생각하기에 컴퓨터가 뽑아주는 랜덤한 값은 연관성 없이 나온 난수라고 생각할 수 있다. 랜덤한 값을 반환해주는 함수는 rand 함수로 stdlib.h(Standard library) 헤더파일에 있다. 아래 코드를 여러번 실행 시켜보면 rand 함수를 호출할 때 마다 다른 값이 나오게 되지만 다시 실행하면 똑같은 값이 나온다.#include #include int main(void) { for(int i = 0 ; i 2. srandrand 함수는 seed에 의존적인데 srand 함수를 통해 seed를 넣을 수 있다. seed의 의미는 아..

디버깅

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.디버깅의 사전적 정의를 이해한다.디버깅 하는 방법을 이해한다.1. 디버깅의 정의디버깅(Debugging)이란 컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산(버그)을 찾아내고 그 원인을 밝히고 수정하는 작업 과정을 뜻합니다. 과거 컴퓨터의 하드웨어에 벌래가 들어와서 오류를 일으킨다는 것이 디버깅의 유래입니다. 디버거(Debugger)는 디버깅 하는 프로그램이고 디버깅을 당하는 대상 프로그램은 디버기(Debugee)입니다.코딩을 하다보면 어떤 이유 때문인지, 그리고 어디서 버그가 발생하는지 원인을 찾기 힘들 때가 있습니다. 디버깅을 공부하면, 버그에 대한 원인 규명과 버그가 어디서 ..

반복문

학습 목표! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.while, for 구문을 이해한다.continue, break 구문을 이해한다.변수의 범위에 대해 이해한다.1. 반복문의 사용 이유반복문은 단어 그대로 코드를 반복시켜주는 역할을 한다. 아래 코드는 기존 방법으로 1부터 5까지의 정수를 출력시켜주는 코드이다. 하지만 1부터 100까지의 정수를 출력시켜주는 코드를 작성하려면 코드가 길어질 뿐만 아니라 인자를 바꾸어 주어야하므로 번거롭다. 이러한 상황일때 반복문을 사용할 수 있다.#include int main(void) { printf("%d\n", 1); // 1 printf("%d\n", 2); // 2 printf("%d\n", 3); // ..