상세 컨텐츠

본문 제목

pointer-2

개발생활/C C++

by 한국인맛집 2021. 4. 13. 20:31

본문

반응형

스택영역, 힙영역

 

스택영역과 힙영역에 대해 간단히 설명 하겠습니다.

#include<stdio.h>

void main(){

   int a;
}

 

 

 

변수를 선언하게되면, 스택영역에 메모리를 적재하고, 컴파일하게되면 메모리를 회수합니다.

 

스택영역의 경우 OS(운영체제)에서 메모리를 총괄하기때문에 코딩을하는 입장에서 메모리가 어떻게 잡히고, 어떤식으로 로 메모리 회수를 해줘야하는지 중요하지 않습니다.

 

하지만 포인터를 배웠으므로,

 

heap[힙] 영역에 메모리를 할당(동적할당) 할수 있습니다.

 

그렇다고해서 동적할당 메모리를 프로그래머가 직접 하지는 않습니다. 하지만

 

직접 메모리를 할당받고, 직접 컨트롤 할수 있습니다.

 

정말 중요한! 부분은 힙영역(동적할당)에 메모리 할당을 한다면, 메모리 회수(release)를 반든시 해줘야만합니다.

 

만약 회수를 해주지 않는다면, 프로그램 메모리가 계속 남게되어, Memory leak (메모리 누수)가 발생합니다.

 


동적할당

 

동적할당은 포인터 변수를 사용해야만 합니다.

 

일반변수로는 동적할당을 할수 없습니다.

 

동적할당을 하는방법은 다음과같습니다.

 

#include<stdio.h>


void main() {
	// 일반 포인터 변수 동적할당 하는방법
    int* ptri = new int;
    char* ptrc = new char;

	// 포인터 배열 동적할당하는방법
    int* arrayI = new int[10];
    char* arrayC = new char[10];

	// 포인터 이중 배열 동적할당 하는방법
    int** dArrayI = new int*[5];
    char** dArrayC = new char* [5];

  	
    // 일반 포인터 변수 메모리 회수
    delete ptri;
    delete ptrc;
    
    // 이중배열, 배열 포인터 메모리 회수방법.
    delete[] arrayI;
    delete[] arrayC;

    delete[] dArrayI;
    delete[] dArrayC;

    fgetc(stdin);
}

 

포인터 배열에서 조금 틀별한데, 메모리 회수를할때 이차원배열을 일반 배열처럼 메모리회수한다.

 

동적할당을 하면 반드시 메모리 회수를 해야한다.

 

동적할당을 지원하지만, 메모리 회수에 관한 내용은 프로그램을 개발하는 개발자에게 책임이 있다.

 

 


 Struct

 

 

Sturct 구조체 라고 합니다.

 

구조체는 특별한 데이터 타입입니다.

 

구조체는 여러개의 데이터타입을 담을수있습니다.

 

클래스 변수나, 포인터 변수, 배열 모든걸 담을수 있습니다.

 

 

 

선언은 다음과 같이 합니다.

 

struct [구조체명] { 
  ...
  ...
};

선언과 동시에 변수를 선언하는방법은 다음과 같습니다.

struct [구조체명] { 
  ...
  ...
}[구조체 변수명1], [구조체 변수명2] , .. ;

 

 

 

사용의 예는 다음과 같습니다.

 

구조체 선언뒤, 구조체 변수는 따로 선언  (이방법은 추천드립니다)

#include<stdio.h>


struct Man {
    int age;
    char names[10];
    char* adress;
};


void main() {
    Man minsu;
    Man chulsu = Man();

  
    fgetc(stdin);
}

 

 

구조체 생성과 한꺼번에 변수 선언

struct Man {
    int age;
    char names[10];
    char* adress;
} chulsu, minsu;

 

 

구조체 안에 선언된 변수, 배열들을 원소라고 합니다.

 

 

구조체에 선언된 원소에 접근하는방법은  '.' ,  '->'  를 이용해 접근할수 있습니다.

 

일반 할당된 구조체는 '.' 으로 접근합니다.

 

 

#include<stdio.h>


struct Man {
    int age;
    char names[10];
    char* adress;
};


void main() {


    Man minsu;
    Man chulsu = Man();

    // 구조체 원소 접근
    minsu.age = 10;
    chulsu.age = 10;

    printf("minsu age = %d\n", minsu.age);
    printf("chulsu age = %d\n",chulsu.age);

    fgetc(stdin);
}

 

동적할당된 원소에 접근하는 방법은 다음과 같습니다.

 

#include<stdio.h>


struct Man {
    int age;
    char names[10];
    char* addr;
};


void main() {
    // 구조체 변수 동적할당
    Man* chulsu = new Man();
    
    // 구조체 원소 접근
    chulsu->age = 10;
    
    // 캐스팅 이라고합니다. (타입변환)
    chulsu->addr = (char*)"korea";

    printf("chulsu age = %d\n", chulsu->age);
    printf("chulsu address = %s", chulsu->addr);

    // 메모리 회수
    delete chulsu;
    fgetc(stdin);
}

 

 

*(해당 접근방법은 반드시 숙달하셔야합니다. 클래스에서 멤버에 접근방법도 같습니다.)

 

 

 

 


혼자 해보기 문제

 

 

 

학생 성적표 프로그램을 만드시오.

 

(조건)

1-0 성적표의 학생 수의 최대 10명입니다.

1-1 학생 성적표 는 구조체로 만들어야합니다.

1-2 학생 성적표는 사용자 입력으로 진행됩니다.

1-3 학생 성적표구조체는 동적할당 되어야 합니다.

1-4 학생 성적표 프로그램 UI는 다음과 같이 나와야합니다.

 

1-5 1번 을 입력하면 학생의 이름, 학생 점수 를 입력받습니다.

 

- 10명이 입력되어 있다면, 입력을 할수 없는 문구를 출력하고 더이상 입력받으면 안됩니다.

 

(학생의 이름은 영어로 입력받고, 학생의 점수는 1번만 받습니다.  총 2회 입력받습니다.)

(입력이 완료되면 처음 화면으로 돌아와야합니다.)

 

1-6 2번 입력을하면 예시와 같이 출력되어야합니다.

예) 현재 학생수 3명 이라면 

 

minsu : 90

chulsu : 30

yemin : 20

 

예) 현재 학생수 0명 이라면

현재 성적표가 비어있습니다.

 

다음을 출력하고 처음화면으로 돌아와야합니다.

 

 

1-7  9번을 입력되기 되면 프로그램이 종료됩니다. 단, 9번을 입력하기전 계속 처음 화면이 나와야합니다.

1-8 1,2,9 번을 제외한 번호가 입력되면 

     "잘못입력되었습니다."  를 출력하고 처음화면이 출력되어야합니다.

 

 

 

 

반응형

'개발생활 > C C++' 카테고리의 다른 글

Array  (0) 2021.04.13
Function / Header File  (0) 2021.04.13
Flow control [Conditional Statements]  (0) 2021.04.04
Loop- 2  (0) 2021.04.04
c/c++ Gitignore file  (0) 2021.03.30
Loop -1  (0) 2021.03.21

관련글 더보기