C언어
-
메모리 동적 할당 및 해제C언어 2020. 3. 4. 19:58
메모리 동적 할당의 필요성 이전 포스트에서 흔히 사용하는 변수는 가상메모리에서 Stack영역의 메모리를 사용하는 것이며 최대 1MB의 크기의 메모리를 사용할 수 있다고 하였다. 그렇다면 프로그램이 더 많은 메모리 자원을 필요로 할 때 or 필요한 메모리의 크기를 확정할 수 없을 때의 경우에는 프로그램이 메모리를 어떻게 할당 받아야 하는가? 라는 의문이 생길 것이다. 예를 들어 학점을 구하는 프로그램이 있을 때 프로그램 제작자는 각 학생들의 점수를 저장해야 할 것이다. 또한 점수를 저장하기 위해서는 메모리의 크기를 기술하여 OS로 부터 메모리 자원을 할당받아야 할 것이다. 이때 학급의 인원이 30명이라고 가정하여 제작자가 int[30] 만큼의 크기의 메모리를 빌려서 프로그램을 작성했다고 했을 때 만약 학급..
-
가상메모리C언어 2020. 3. 3. 21:48
C에서 작성한 어플리케이션이 사용하는 변수, 상수, 포인터 등 모든 개념들의 본질은 컴퓨터 메모리 자원의 사용을 의미한다는 것은 이제 알 것이다. 즉 Hello World 프로그램이 있다고 가정하고 해당 프로그램을 실행 시키기 위해서는 컴퓨터의 메모리 자원을 가져다 사용해야 하며 해당 메모리 자원은 다음과 같은 이유로 사용된다. 프로그램이 실행 되기 위해 필요한 메모리, 사용자가 원하는 결과를 담을 메모리, 프로그램이 작업을 수행하면서 필요한 메모리 등등 실행중인 응용프로그램 즉 프로세스는 메모리자원을 사용하게 된다. 또한 위와 같은 메모리 할당 과정을 C언어에서 문법적으로 나타낸 것이 변수, 상수, 포인터, 배열 등의 개념이다. 변수, 상수, 포인터, 배열 => 자료형과 식별자 (이름)을 통해 메모리에..
-
메모리의 구조와 포인터C언어 2020. 3. 1. 21:56
컴퓨터는 내부적으로 연산 즉 CPU가 동작하는 과정에서 정보를 가져오고 연산된 정보를 다시 저장하는 공간이 메모리라는 것은 이제 알 것이다. 메모리에 접근을 할 때 메모리의 위치정보를 식별할 수 있는 주소라는 개념이 있으며 이 주소라는 것을 통해 메모리에 저장된 값을 읽거나, 쓰거나, 옮기는 등 의 작업이 이루어진다. 포인터는 이러한 메모리의 주소를 저장하는 특별한 변수이다. 포인터의 선언은 다음과 같다. 위에서 설명하였듯 포인터는 메모리의 주소를 담는 변수이다. 따라서 포인터는 주소로 채워지게 된다. '&' 연산자를 통해 ndata 의 주소를 반환하여 int * (int 포인터) 자료형인 pndata라는 변수에 주소 값이 넘겨지는 것을 볼 수 있다. 위의 0x 0018 FF10의 주소에 0x 00 18..
-
함수 기본 이론C언어 2020. 2. 28. 17:07
C 언어 프로그래밍은 main 함수에 사용자가 원하는 작업을 절차상의 흐름에 맞게 작성한 것이라고 볼 수 있다. 즉 C 언어는 함수로 시작해서 함수로 끝난다. 따라서 함수에 대한 이해가 필요하다. 함수는 다음과 같은 구조로 생겼는데 최상단의 함수의 원형 그리고 '{}' 안에 들어가는 정의의 조합으로 함수가 동작하게 된다. 이때 함수의 선언 부를 보면 다음과 같다 1. 함수가 반환할 자료형 2. 함수의 이름 ( 내부적으로는 해당 함수의 주소를 나타낸다 ) 3. 함수를 실행함에 있어 받아 올 자료 ( 매개변수, 파라미터, 인자 등으로 불림) + 함수의 원형에 기술하는 매개변수는 반드시 자료형을 전부 기술해 주어야 한다. + 함수의 매개변수는 지역변수 + 자동 변수의 개념이다. + 따라서 매개변수의 유효 범위..
-
배열의 주소와 이름의 관계C언어 2020. 2. 26. 14:53
배열은 특정 자료형으로 이루어진 인스턴스들의 집합체이며 배열의 본질은 메모리의 일정 공간이기 때문에 배열은 메모리의 주소로 식별한다. C언어와 같은 고급 언어는 16진수 체계의 주소 말고 이름이라는 식별자를 통해 배열을 식별하게 되며 여기서 식별자 즉 이름이 가르치는 것은 두가지가 있으며 하나는 식별자를 통해 배열이라는 것을 가르키며 또다른 하나는 식별자는 배열이 시작하는 인스턴스의 첫 번째 메모리의 주소를 가리킨다. 이전 포스트에서 위와 같이 배열에 대해 설명을 한 적이 있다. 아래의 그림을 보면 위에서 설명한 배열의 정의와 맞지 않는 부분이 생길 것 이다. 배열의 이름 => 0, 1, 2 ( 배열의 주소범위 00E7FE64 ~ 00E7FE6C ) 배열의 주소 => 0, 1, 2 ( 배열의 주소범위 0..
-
프로그램의 성능향상 ( 쇼트서킷 )C언어 2020. 2. 24. 15:49
쇼트서킷이란 ? 하지 않아도 될 연산을 생략해 논리 연산식의 효율을 높이는 것 이다. 1. 논리 연산식은 무조건 왼쪽에서 오른쪽으로 수행한다. 2. OR 논리식은 조건에 만족하면 이후 연산을 생략한다. 즉 앞에 위치한 조건이 참일 경우 OR 논리에 의해 뒤의 연산은 수행하지 않고 바로 참을 반환한다. 3. AND 논리식은 조건에 만족하지 않으면 연산은 생략한다. 즉 앞에 위치한 조건이 거짓일 경우 AND 논리에 의해 뒤의 연산은 수행하지 않고 바로 거짓을 반환한다. 4. 혼합 논리식에서 AND는 한 덩어리로 묶고 OR의 연속으로 살핀다. EX ) nAge >= 20 && nAge = 150 위와 같은 쇼트서킷을 활용하여 프로그램을 작성하면 성능향상에 도움을 준다. 그렇다면 어떤식으로 쇼트서킷을 활용해야 ..
-
연산자 (sizeof), 디스어셈블C언어 2020. 2. 24. 10:16
이번 포스트에서는 C의 연산자 중 하나인 sizeof 연산자에 대해서 다룰 것이다. sizeof 연산자는 피연산자의 자료형에 대한 연산을 수행해준다. 즉 sizeof (5)라고 입력이 되면 피연 사자 5는 int 자료형임으로 int 자료형의 크기인 4byte가 반환된다. 이와 같이 sizeof 연산자는 피연산자의 자료형에 대한 값을 반환해주는 연산자이다. + sizeof 연산자의 피연산자가 연산 식이라면? 위와 같은 경우 연산식은 실행하지 않으며 해당 연산식의 결과에 해당하는 자료형의 크기가 반환된다. printf("% d", sizeof ( 10 + 0.2 )) 결과는 10 => int, 0.2 => double 따라서 형 승격이 이루어지면서 더 큰 자료형인 double 자료형의 크기가 출력된다. 또한..
-
정수의 입력 함수 (scanf), 버퍼의 추상화C언어 2020. 2. 19. 18:27
앞의 포스트에서 다룬 내용은 문자열과 문자의 입력 출력 함수와 함수가 내부적으로 버퍼를 통해 어떤 식으로 동작하는지 알아보았다. 이번 포스트에서는 정부의 입력 함수와, 정수의 오버플로우, 앞에서 계속 설명한 버퍼에 대해서 다룰 것이다. 정수를 입력받기 위해 필요한 함수는 scanf함수이다. printf 함수와 마찬가지로 형식문자열을 받는 형태이다. scanf : 형식 문자열에 맞추어 표준입출력장치(stdin) 로 부터 정보를 읽어들이는 함수이다. 인자값으로는 사용자가 입력한 값을 저장할 메모리의 주소를 받게 된다. + stdin : 표준입출력장치 즉 콘솔을 추상화 시킨 개념 위의 자료는 콘솔에 대한 입력 버퍼 구조체를 확인하면서 버퍼에 대해 자세히 살펴보기 위한 코드이다. stdin는 표준입출력 장치를 ..