블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
    - Double linked list

    ⇒ 2중(양방향) 연결 리스트 - ex. 메모장

    ※ 배열로 연결리스트를 만들면

    ⇒ 장점 : 포인터로 순서를 마음대로 바꿀 수 있다.

    ⇒ 단점 : 숫자가 많으면 복잡하다, 개수를 늘리기 위해 컴파일을 다시 해야 한다.

    ⇒ 그래서 malloc을 사용한다.(동적할당 - 힙 영역)




    - malloc() 함수: 메모리의 동적 할당

    ⇒ C 프로그램에서 프로그램의 실행도중 필요한 메모리를 시스템으로부터 할당받을 때는 malloc() 함수를 사용하고, 사용 후 메모리를 시스템에 반환할 때는 free() 함수를 사용한다. 원형은 아래와 같다.

            void *malloc(size_t size);

            void free(void *ptr);

    ⇒ 여기서 size는 할당하고자 하는 메모리의 바이트 수이다. size_t 형은 <stdio.h> 파일에 정의된 자료형으로 C의 표준형으로 정의된다. 보통 unsigned int 형이나 unsigned long 형으로 정의되어 컴파일러가 허용하는 가장 큰 크기의 값을 저장할 수 있도록 한다.

    ⇒ malloc() 함수는 할당된 메모리의 시작주소를 반환한다. 만약 메모리의 부족으로 메모리 할당이 실패했을 경우 NULL을 반환한다. malloc() 함수에 의해 할당된 메모리를 시스템에 반환할 경우에는 free() 함수를 호출한다. malloc() 함수에 의해 할당된 메모리는 프로그램 실행이 끝나기 전 반드시 free() 함수로 해제시켜야 한다.

    ⇒ 컴파일러에 따라서 프로그램의 실행이 종료된 뒤에도 이 할당된 메모리가 시스템에 반환되지 않아 다음번 실행에 오류가 발생하는 경우가 있다.



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

    typedef struct
    {
            
    char name[20];
            
    int score;
    }STUDENT;
    int main()
    {
            STUDENT st[
    3], *sp;
            
    int i = 0;

            sp 
    = (STUDENT *)malloc(sizeof(STUDENT));
            
    if(sp == NULL) // 메모리 할당이 실패한 경 경우 

            {
                    printf(
    "allocation error\n");
                    
    return -100;
            }
            
            
    while(i<3)
            {
                    printf(
    "Please enter student name & score : ");
                    scanf(
    "%s %d", sp->name, &sp->score);

                    //strcpy(st[i].name, sp->name); // strcpy() 사용

                    //st[i].score = sp->score;

                    //++i;

                    //bcopy(sp,&st[i],sizeof(STUDENT)); // bcopy() 사용

                    //++i;

                    memcpy(&st[i],sp,sizeof(STUDENT)); // memcpy() 사용

                    ++i;

            }

            printf("sp(code 영역)   : %08X\n", sp);

            printf("st(stack 영역)  : %08X\n", st);

            printf("main(heap 영역) : %08X\n", main);


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

    ⇒ 실행결과        

     

    ⇒ bcopy()

     → 2바이트 복사

    ⇒ memcpy()

     → 메모리 복사

    ⇒ STUDENT st[3];

     → STUDENT 배열의 공간이 아래와 같이 할당한다.

     

    namep[20]

    score

    st[0]

    st[0].name

    st[0].score

    st[1]

    st[1].name

    st[1].score

    st[2]

    st[2].name

    st[2].score


    ⇒ sp = (STUDENT *) malloc (sizeof(STUDENT));

     → malloc() 함수의 인자인 sizeof(STUDENT)는 구조체 STUDENT의 크기를 돌려준다. 여기서는 24byte가 된다. malloc() 함수는 23 byte만큼의 메모리를 할당하여 그 주소를 돌려주면, 이 주소를 포인터 변수 sp가 받는다. malloc() 함수의 반환자료형은 (void *) 형으로 정해지지 않은 자료형을 가리키는 포인트이다. (STUDENT *)는 캐스트 연산자로 malloc() 함수의 결과값을 STUDENT 형을 가리키는 포인터로 바꾸어 준다.

    ⇒ free(sp);

     → sp가 가리키는 메모리를 시스템에 돌려준다.





    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함