분류 전체보기(63)
-
POCU C언어 정주행 8회차 - 스트림, 입출력 함수, 버퍼, 입력 알고리즘
1. 스트림 (Stream) stream이라는 단어는 흐름이라는 뜻을 가지고 있으며 물이 흘러 내리는 것처럼 한 방향으로의 흐름을 뜻한다. C에서 stream이라고 하면 데이터가 흐르게 해주는 다리의 역할을 하는 매개체이다. 스트림에도 여러 종류가 있을 수 있는데 이 글에서 다룰 내용은 콘솔 입출력 스트림이며 키보드와 모니터를 뜻한다. 이제 전체 구조를 보자. 사실 원래는 스트림을 사용하려면 운영체제에 스트림의 생성을 요청해야 한다. 근데 우리가 지금까지 콘솔로 프로그램을 작성하면서 그런 코드를 작성한 적이 없던 이유는 콘솔 입출력을 위한 스트림은 프로그램이 실행과 종료에 따라 자동으로 생성과 소멸을 알아서 시켜주기 때문이다. 이 스트림을 표준 입출력 스트림이라고도 하며 다음과 같은 것들이 있다. std..
2022.12.14 -
POCU C언어 정주행 7회차 - 문자열 함수 특징, 문자열 함수 구현 및 설명
1. C언어의 문자열 함수 특징 새로운 메모리를 선언하지 않음 C언어는 문자열 함수를 구현하는 과정에서 정말 어지간하면 새로운 char배열을 위한 메모리를 선언하지 않는다. 심지어 반환형이 char*로 되어있어서 동적으로 할당시킨 메모리를 반환해주지 않을까? 라는 생각이 들만한 함수도 절대 추가로 메모리를 할당시키지 않는다. 그 이유는 메모리 관리적인 측면 때문이라고 하는데 동적으로 생성하는 경우와 스택에 생성하는 경우를 보자. 만약 동적으로 할당을 시켰는데 프로그래머가 제대로 메모리를 해제시키지 않으면 메모리 누수가 발생할 수 있다. 그런데 프로그래머는 해당 함수가 동적으로 메모리를 추가로 할당시키는지 그렇지 않는지를 문서를 보기 전까지는 알 수 없으며 이것은 꽤 번거로울 것이다. 그렇다고 스택에 할당..
2022.12.12 -
POCU C언어 정주행 6회차 - 댕글링 포인터, 포인터 연산, 캐스팅, ASLR
0. 포인터 의외로 포인터에서도 내가 몰랐던 부분들이 다수 언급되었다. 낯설게 느껴졌던 단어도 좀 있었고 보안쪽에서 나올법한 단어도 보였다. 뿐만 아니라 포인터 연산을 하는데 있어서 딱봐도 "어? 이렇게 짜면 안될것 같은데?"라고 느껴져서 짜보지 않았던 방식의 코드들도 볼 수 있었다. 어쨋든 이런 기초 부분에 있어서도 내가 부족한 것이 많았구나라는 것을 다시 한번 느끼게 되었다. 그럼 이제 정주행한 내용 중 몰랐던 부분, 중요한 부분을 정리해보자. 1. 댕글링 포인터 (Dangling Pointer) 댕글링 포인터는 포인터가 기존에 가리키고 있던 것에 연결 관계가 끊어졌을 때, 그 포인터를 댕글링 포인터라고 한다. dangling이라는 단어가 빳빳한 줄이 끊어졌을 때처럼 달랑거린다는 뜻을 가지고 있는데 ..
2022.12.10 -
POCU C언어 정주행 5회차 - 스택 메모리, 어셈블리어
1. 스택 메모리 스택 메모리는 함수 내의 지역 변수 등을 저장하는 메모리라는 것을 C/C++을 배웠던 사람이라면 누구나 배웠을 법한 내용이다. 다만 이 글에서는 어떤 메모리가 어떤 녀석인지까지 처음부터 적지는 않을 것이고 그냥 내가 몰랐던 부분만 몇 개만 짚고 넘어갈 것이다. 우선 용어 정리부터 간단하게 해보자. 스택 프레임: 각 함수가 사용하는 스택의 범위 EBP (Extended Base Pointer): 현재 스택 프레임이 사용하고 있는 첫 시작 주소 ESP (Extended Stack Pointer): 스택 메모리 내에서 현재 사용하고 있는 곳까지의 주소 기본적으로 프로그램이 실행되면 그 프로세스를 위한 메모리로 용도에 따라 코드, 데이터, 힙, 스택으로 4개의 영역으로 구분되는 것을 볼 수 있..
2022.12.10 -
POCU C언어 정주행 4회차 - scope(범위), goto문, const
1. scope (범위) 범위에 대해서 이야기를 하면 흔히들 ' { } ' 같은 중괄호 기호를 떠올리고는 한다. 하지만 내가 봤던 강의에서 다룬 범위는 총 4가지 개념이 있다. 블록 범위 파일 범위 함수 범위 함수 선언 범위 블록 범위 우리가 함수를 선언하고 정의할 때, 혹은 조건문이나 반복문을 사용할 때 쓰는 ' { } '가 사실 블록 범위이다. 함수를 정의할 때 쓰는 중괄호는 함수 범위가 아니냐고 이야기할 수 있는데 사실은 블록 범위이다. C언어에서는 블록이 시작될 때, 변수를 모두 한꺼번에 초기화를 하게끔 만들어 놓았는데 그래서 다음과 같이 코드를 짜면 컴파일 에러가 난다. #include int main(void) { int a = 10; printf("%d\n", a); int b = a + 2..
2022.12.08 -
POCU C언어 정주행 3회차 - 평가 순서, Sequence Point
1. 평가 순서 첫 문장부터 뜬금없긴 한데 이 문제를 풀 수 있겠는가? 그냥 간단한 코드를 보고 실행이 어떻게 될지 맞추면 되는 아주 간단한 문제이다. #include int g_num = 0; int AddOne() { return ++g_num; } int SubstractOne() { return --g_num; } int main(void) { printf("%d, %d\n", AddOne(), SubstractOne()); return 0; } 그냥 값이 0으로 초기화된 전역 변수에 1씩 더하고 빼는 연산을 할 뿐이다. 대부분의 사람들은 이 코드를 보고 다음과 같은 흐름으로 프로그램이 실행될 것이라고 판단한다. printf("%d, %d\n", AddOne(), SubstractOne()); p..
2022.12.08