C++프로그래밍

2013.04.18_연결리스트_동적자료형/정적자료형

성엽이 2013. 4. 18. 17:53

▶연결리스트_동적자료형/정적자료형


 정적자료형 : 크기가 프로그램의 선언부에서 한번 정해지면 바뀔 수 없다.

     데이터의 삽입과 삭제가 자유롭지 못하다.

     또, 메모리를 사용하는데 비효율적이다 

     ex) 게임 로그인 500만명을 예상하고 메모리를 잡아놨는데, 20명이 로그인을 함. 

     낭비중에 낭비! 





 동적자료형 :
            프로그램의 실행 도중 필요에 따라 변수를 생성시키거나 소멸시킬 수 있다.

프로그램 실행시 한번 선언된 변수는 함수의 실행이 종료될 때 까지 지속되는 정적자료형과는 다른 개념이다.

동적자료형의 변수는 정적자료형의 변수처럼 변수 자체가 이름을 갖는 것이 아니라 

포인터변수(참조변수)를 이용하여 간접적으로 접근한다. 이때 참조변수는 동적변수의 주소를 가지고 있다.(심볼테이블에 안적힘)

**************************************************************************************************

실행될때 메모리를 가져온다는 개념!

주소도 실행될때마다 불러오므로 매번 다르다!

이때 불러올 자료형은 개발자가 정한다!

동적자료형은 Heap에서 메모리를 빼오며, 

운영체제가 관리하고 파일을 만들지 않는다!

*********************************************************************

 

▶ Malloc() 함수, free() 함수

 * malloc() (Memory allocation = 메모리 위치 함수)

  안쓰는 메모리를 주는 것이기 때문에 없으면 0 을               반환하고, 메모리를 주지 못한다!



{
  auto int A;
}

여기서 중괄호안에서의 정적변수는 A는 자동변수 선언됨과 동시에
4 byte를 할당받고 중괄호가 끝나면 지움이 자동적으로 된다.

하지만  malloc() 함수는 자동변수가 아니므로 메모리를 가져오면 반드시 free() 함수로 메모리를 지워줘야 한다. 반드시! 안그럼 터짐 펑~

 void * 선언시에 가리키는 곳이 미정이므로 모든 포인트 자료형에 쓸수 있다. 

하지만 printf() 로 출력을 할때 가리킬수는 있지만,

안에 있는 본 값의 자료형이 다르기때문에 형동등성에 의해서 출력이 안됨, 그래서 캐스팅을 이용하여 출     력한다. 

void 는 반환자료가 없지만 void * 는 주소라는 것을 기억해주자 !

 void * malloc( size_t size ) , 여기서 size_t 는 typedef 을 써서 만들은 자료형이고 unsigned int 이다.

 malloc() 함수는 할당메모리의 시작주소를 반환한다.
 
 ※보통 malloc() 함수를 쓰는 형식
 int *p = malloc(sizeof(자료형)); 

 void free(void *ptr)

 ※보통 free() 함수를 쓰는 형식

 free(p);


▶ 예문


#include <stdio.h>

int main()
{
  int a = 100;
  short b = 200;
  char c = 10;
  float d = 5.0f;
  
  void * vp = 0;  // 포인터로 가리키는 곳의 자료형이 미정!
      // 뭔지는 모르겠지만 아무곳이나 다 가리킴!

  /*int *pa = &a;
  short *pb = &b;
  char *pc = &c;  
  float *pd = &d;
    
  //pa = pd;  // 둘다 자료형은 포인터고 주소를 가지니깐 에러
  vp = pd;

  printf("%d\n", *pa);
  printf("%d\n", *pb);
   printf("%d\n", *pc);
  printf("%f\n", *pd);
  //printf("%f\n", *vp);  // 에러뜸
  printf("%f\n", * ((float *)vp));  // 캐스팅해줬음.
  */


  vp = &a;
  printf("%d\n", * ((int *)vp));
  vp = &b;
  printf("%d\n", * ((short *)vp));
  vp = &c;
   printf("%d\n", * ((char *)vp));
  vp = &d;
  printf("%f\n", * ((float *)vp));  // 어셈블리어로 바뀌면 다
            // 주소로 바뀌지만, 낭비되는 메모리가
            // 없다!!!!

  return 0;
}
 



 
#include < stdio.h >
#include < stdlib.h >
#include < string.h >

typedef struct
{
  char name[20];
  int score;
}STUDENT;

int main()
{
  STUDENT st[3];
  STUDENT *sp;
  int i=0;
  
  sp = (STUDENT *)malloc(sizeof(STUDENT));

  if( sp == NULL )
  {
    printf("allocation errre\n");
    exit(-1);
  }

  while(i<3)
  {
    printf("Please enter student name & score : ");
    scanf("%s %d", sp->name, &sp->score);
    strcpy(st[i].name, sp->name);
    st[i++].score = sp->score;
  }
  free(sp);
  
  for( i = 0; i < 3 ; i++)
  {
    printf("student name : %s,\tscore : %d\n",st[i].name, st[i].score);
  }
  return 0;
}