C언어 복습(21)
-
POCU C언어 정주행 9회차 - 파일 입출력, 예외 처리, 스트림 위치
1. 파일 입출력 파일을 읽고 쓰는 것에 대한 입출력 스트림은 지난 글에서 봤던 표준 입출력 스트림의 방식과 동일하다. 사용자의 요청으로 별도의 파일을 읽고 쓰기 위한 스트림이 만들어지고 없어진다는 것만 제외하면 말이다. 다만 파일을 읽고 쓸 때는 일반적으로 이전 글과는 다르게 텍스트 형식이 아니라 바이너리 형식으로 데이터를 읽고 쓴다. 다만 주의할 것이 있는데 같은 형식의 데이터라고 해도 크기가 시스템마다 다를 수 있어서 파일에 저장할 데이터의 크기를 고정해두는 것이 좋다. 어떤 시스템에서 만들어진 파일을 다른 시스템의 실행 파일에서 사용할 때 문제가 생길 수 있기 때문이다. 그럼 바이너리 데이터를 읽고 쓰는 함수와 파일을 열고 닫는 함수를 알아보자. /* 데이터를 몇 번 읽었는지 반환 */ size_..
2022.12.16 -
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언어 정주행 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