malloc & free 기본 사용법


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

int main()
{
    int *p;
    int i,n;

    printf("입력할 정수의 수 : ");
    scanf("%d", &n);

    p = (int *)malloc(n*sizeof(int));

    printf("%d개의 정수를 입력해주세요.\n", n);
    for(i=0;i<n;i++)
    {
        scanf("%d", &p[i]);
    }

    printf("역순으로 출력합니다.\n");
    for(i=n-1;i>=0;i--)
    {
        printf("%d ", p[i]);
    }

    free(p);
    return 0;



#include <stdio.h>

#include <string.h>

#include <stdlib.h>


char *arr_char(int len)

{

char *str=(char*)malloc(sizeof(char)*len);

return str;

}


int *arr_int(int len)

{

int *arr=(int*)malloc(sizeof(int)*len);

return arr;

}


int main(void)

{

char *str=arr_char(20);

int *arr=arr_int(2);


strcpy(str, "Hello Malloc!");

printf("%s\n", str);

arr[0] = 1;

arr[1] = 2;

printf("%d\n%d\n", arr[0], arr[1]);


free(str);

free(arr);

return 0;


'프로그래밍 > C' 카테고리의 다른 글

포인터에 관한 고찰  (0) 2014.10.30
assert 매크로 사용법  (0) 2014.01.27
이중배열과 포인터 문제 하나  (0) 2013.12.01
typedef  (0) 2011.01.22
공용체와 열거체  (0) 2011.01.19
구조체  (0) 2010.10.23
배열과 포인터의 관계  (0) 2010.10.09

1. 정의
 typedef 기존데이터형 새이름;
 
 ex) typedef int NUM;
       typedef char STR;
       typedef struct STUDENT;

typedef는 매번 앞에 struct나 union, enum 키워드를 써야하는 구조체나 공용체, 열거체를 정의할 때 유용하다. 'struct 태그명'을 typedef로 이름을 지정하면 사용하기가 편리하다.

  typedef struct point{
   int x;
   int y;
 }POINT; // struct point를 POINT라는 이름으로 정의

위와 같이 struct point를 POINT라고 정의하면 POINT를 새로운 데이터형으로 사용할 수 있다.

 POINT p1, p2; // 이것은 struct point p1, p2;와 같은 의미이다.

수학에서 치환과 비슷한 개념이라고 생각하면 된다.
위와 같이 구조체를 정의하면서 typedef를 정의할 수도 있고, 구조체를 정의한 후에 할 수도 있다.

  struct point{
   int x;
   int y;
 };
 typedef struct point POINT;

typedef로 정의된 데이터형도 원형 그대로 사용이 가능하다.

 struct point p1;
 POINT p2;

<예제>
 #include <stdio.h>
 struct point{
  int x;
  int y;
 };
 typedef struct point POINT;

 int main(void){
   struct point p1 = {10, 20};
   POINT p2;
   p2 = p1;
   printf("p2의 좌표 : %d, %d\n', p2.x, p2.y);
   return 0;
}

2. typedef 사용 목적
 typedef를 사용하면 이식성(portability)과 가독성(readability)에 큰 도움이 된다.
  struct point{
   int x;
   int y;
 }; // 1번

  struct point{
   double x;
   double y;
 }; // 2번

 만약 point 구조체가 1번과 같을 때 변수는 int형이다. 그런데 만약 실수를 사용하는 경우가 생긴다면 2번과 같이 구조체를 새로 정의해야 한다. point 구조체를 사용하는 함수가 존재하거나 다른 곳에서 자주 사용되고 있다면 일일이 모두 수정해야만 한다. 하지만 typedef를 사용하면 간단하다.

 typedef int nType;
 struct point{
   nType x;
   nType y;
 }; // 1번

 typedef double nType;
 struct point{
   nType x;
   nType y;
 }; // 2번
 typedef 정의 부분에서 데이터형만 변경함으로써 간단하게 수정이 가능하다.

 가독성 면에선 다음과 같은 경우를 가정해보자. unsigned char는 문자를 저장할 수도 있고 1바이트 정수형을 저장할 수도 있다. 이 경우 어떤 용도인지 명확히 구분할 때 typedef를 사용할 수 있다.
 typedef unsigned char oneByte;
 oneByte data;

'프로그래밍 > C' 카테고리의 다른 글

assert 매크로 사용법  (0) 2014.01.27
이중배열과 포인터 문제 하나  (0) 2013.12.01
malloc & free 기본 사용법  (0) 2013.07.23
공용체와 열거체  (0) 2011.01.19
구조체  (0) 2010.10.23
배열과 포인터의 관계  (0) 2010.10.09
포인터 (Pointer)  (0) 2010.10.09
1. 공용체
 공용체는 여러 멤버들이 메모리를 공유하게 하는 것이다. 즉, 모든 멤버들의 주소가 같다. 구조체는 메모리에
순차적으로 멤버를 할당하지만 공용체는 같은 메모리를 함께 사용하는 이다.

union 태그명{
 데이터형 멤버형;
 데이터형 멤버형;
 ...
};

ex)
union data{
 unsigned int num;
 unsigned char arr[4];
}; 

 union data d1; //공용체 변수의 선언

 공용체 변수는 메모리에 할당될 때 같은 주소에 할당되는데 공용체 크기는 가장 큰 멤버의 크기와 같다.
위의 예에서는 멤버 모두 4바이트이므로 전체 크기도 4바이트가 된다.
<--------------------------------------------------- num --------------------------------------------------->
 arr[0] arr[1]  arr[2]  arr[3] 
<-------------------------------------------------- 4바이트-------------------------------------------------->

 공용체의 초기화나 접근 방법은 구조체와 동일하게 {}와 .을 사용한다. 다만 초기화할 때 여러 멤버 중 한 번에
하나만 사용할 수 있으므로 첫 번째 멤버의 초기값만 지정한다.

<예제> 공용체의 사용 예
 #include <stdio.h>
union data{
 unsigned int num;
 unsigned char arr[4];
};
int main(void){
union data d1;
int i;
printf("data 공용체의 크기 : %d\n", sizeof(union data));
d1.num = 0x12345678;
printf("d1.num = %08x\n", d1.num);
for(i=0;i<4;i++)
 printf("d1.arr[%d] = %02x\n", i, d1.arr[i]);
return 0;
}

d1.num을 0x12345678로 초기화했기 때문에 같은 메모미를 사용하는 d1.arr 역시 같은 값을 가진다. d1.arr는 배열이므로
4바이트인 num의 값을 바이트 단위로 접근이 가능하다. 따라서 실행결과는 다음과 같다.

 data 공용체의 크기 : 4
d1.num = 12345678
d1.arr[0] = 78
d1.arr[1] = 56
d1.arr[2] = 34
d1.arr[3] = 12

※ 리틀 엔디안과 빅 엔디안
리틀 엔디안(little endian) : 최하위 바이트부터 메모리에 저장하는 방식 (인텔 계열 CPU)
빅 엔디안(big endian) : 최상위 바이트부터 메모리에 저장하는 방식 (모토로라 계열 CPU)

                                                                     unsugned int num = 0x12345678;

 12  34 56  78    78  56  34  12 
0x1000          0x1001           0x1002          0x1003                                0x1000          0x1001           0x1002          0x1003
                             빅 엔디안 방식                                                                            리틀 엔디안 방식

PC는 주로 인텔 계열의 CPU를 사용하므로 예제의 결과도 리틀 엔디안 방식으로 메모리에 값이 저장된 것을 확인할 수 있다.

공용체가 유용하게 사용되는 경우를 살펴보자.

 struct info{
 char name[10];
 int job_code;
 char company_name[20];
 char school_name [20];
};
job_code가 0이면 학생, 1이면 회사원이라고 가정하자. 이때 위와 같이 구조체로 정의하면 job_code가 어떤 것이라도
일단 메모리에 company_name 변수와 school_name 변수가 할당된다. 따라서 학생일 경우 company_name 변수를
사용하지 않고 회사원일 경우 school_name 변수를 사용하지 않으므로 메모리가 낭비된다.
이런 경우 공용체를 이용해서 구조체를 정의하면 메모리 낭비를 막을 수 있다.

 struct info{
 char name[10];
 int job_code;
union{
 char company_name[20];
 char school_name [20];
}job_info;
};

2. 열거체
열거체(enumerated type)는 열거형이라고도 하며, 정수형의 일종이다.

 enum 태그명 {열거상수1, 열거상수2, ...};

ex) enum week {sun, mon, tue, wed, thu, fri, sat};
 위와 같이 열거체 변수에는 열거체 정의에 나열된 열거상수 값 중 하나를 저장해야 한다.
 열거체와 열거상수는 프로그램의 가독성(readability)을 향상시키는 기능을 한다.


'프로그래밍 > C' 카테고리의 다른 글

이중배열과 포인터 문제 하나  (0) 2013.12.01
malloc & free 기본 사용법  (0) 2013.07.23
typedef  (0) 2011.01.22
구조체  (0) 2010.10.23
배열과 포인터의 관계  (0) 2010.10.09
포인터 (Pointer)  (0) 2010.10.09
선택정렬 (Selection Sort)  (0) 2010.10.09

+ Recent posts