내장형 하드웨어/C언어

구조체(typedef, struct), 연결리스트

동화다아아 2011. 5. 12. 17:20
 

- 구조체

⇒ 의미상으로 연관된 여러 데이터를 하나의 이름으로 묶은 사용자 정의 자료형으로, 여러 가지 속성을 가지고 있는 개체를 정의할 수 있다.

⇒ typedef 문

 → 예약어 typedef은 새로운 자료형을 정의하는 데 사용된다.

 → 긴 이름의 자료형을 짧게 정의하는 데 편리하게 이용되며, 구조체의 선언에서 유용하게 사용된다.


// typedef으로 정의한 자료형을 이용하여 프로그램을 작성하는 예

#include<stdio.h>

typedef char NAME[20]; // 새로운 자료형 NAME의 정의

typedef int AGE; // 새로운 자료형 AGE의 정의


int main()

{

        NAME student; // student의 자료형은 NAME이다.

        AGE stAge; // stAge의 자료형은 AGE이다.


        puts("Enter Name: ");

        gets(student);

        puts("Enter Age: ");

        scanf("%d", &stAge);

        printf("%s   %d\n",student,stAge);


        return 0;

}

⇒ 출력결과

        

 

⇒ gets 는 해킹에 취약하다.

⇒ sizeof(student)를 해보면 크기가 20이다. 왜냐하면 char 형의 배열로 [20]만큼의 공간이 확보되어 있으므로.

⇒ 위 프로그램에서 gets에 20글자 이상을 넣으면 세그멘테이션 오류가 발생한다. 이것은 해킹의 주요한 원인이 된다. 그렇기에 gcc 컴파일러가 the 'gets' function is dangerous and should not be used.는 경고 메시지를 띄운다.

        

 



- 구조체의 정의

⇒ 배열과 함께 데이터베이스를 구축하는 데 이용되기도 하고, 연결리스트의 노드를 만드는 데 사용되기도 한다.

⇒ 배열은 의미상으로 서로 연관된 동일한 자료형을 가진 자료들을 하나의 이름으로 묶어서 다루기 편리하게 만든 자료형. 구조체는 서로 연관이 되지만 자료형이 다른 자료들을 하나의 이름으로 묶은 것.

⇒ 구조체와 배열은 서로 중첩되게 정의할 수 있다. 그래서 복잡한 구조의 자료를 효율적으로 구성할 수 있다.

⇒ 구조체의 원형(template)을 정의하고, 변수를 선언하는 방법.

 → struct student

    {

        char name[20];

        int phone_number[14];

        int age;

    };

 → 위의 예는 구조체의 구성요소를 정의하는 것으로 메모리의 할당과는 무관하다.

 → 정의는 먼저 struct라는 예약어로 시작한다. 그 뒤의 student는 태그(tag)라고 부르는 구조체 템플릿의 이름이다.

 → 태그 다음에는 구조체의 구성요소가 중괄호에 둘러싸여 정의되고, 마지막으로 세미콜론으로 끝난다. 중괄호에 둘러싸인 각 구성요소는 멤버 혹은 필드라고 부른다.

 → 각 멤버의 정의는 자료형과 이름으로 구성되고, 세미콜론으로 긑난다. 위의 정의에서는 세 개의 멤버가 정의되었고, 첫 번째 멤버 name은 20개의 원소를 가지는 문자배열로 정의되었다. 이것은 구조체 내에 배열이 구조체의 한 멤버로 이용된 경우이다.

 → 두 번째와 세 번째 멤버는 english 와 math로 int 형으로 정의 되었다. 구조체 정의의 맨 끝에 세미콜론을 찍는 것에 유의해야 한다.


 → struct student st1;    // 변수의 선언

        

 

st1

name[20]

20 바이트

english

4 바이트

math

4 바이트

 → 여러개의 변수를 선언할 때는 다음과 같이 선언한다.

 → struct student st1, st2, s3, *st; // 여기서 st는 구조체를 가리키는 포인트 변수.

 



#include<stdio.h>


typedef struct student // typedef을 이용하여 구조체 정의

{

        char name[20];

        int english;

        int math;

}STUDENT;


int main()

{

        struct student kim; // 변수의 선언

        STUDENT kang; // typedef를 이용해 선언한 구조체 변수의 선언

        STUDENT *P;

        P = &kim;

        kim.math = 100; // 구조체 변수.멤버이름

        kang.math=90;

        printf("kim_math : %d\n", kim.math);

        printf("kang_math : %d\n", kang.math);

        printf("kim_math : %d\n",P->math);

                

        return 0;

}

⇒ 실행결과

        

 

※ 아래의 두 가지는 같은 의미.

⇒ typedef struct student

   {

        char Name [20];

   }STUDENT;

 → ① typedef ② struct student{ ~ } ③ STUDENT ④ ;

⇒ typedef unsigned int unit;

 → ① typedef ② unsigned int ③ unit ④ ;


⇒ 포인터를 사용할 때 P->math로 입력한다. (도트연산자(.) 대신 ->를 사용.)


#include<stdio.h>

//#pragma pack(1)


typedef struct link

{

        int iNum;

        struct link *next;

}LINK;

        

int main()

{

        LINK one = {1,0};

        LINK two = {2,0};

        LINK three = {3,0};

        LINK *P = &one;

        one.next = &two;

        two.next = &three;


        while(0!=P)

        {

                printf("%d -> ", P-> iNum);

                P = P->next;

        }

        printf("NULL\n");

}


⇒ 출력결과         

 ⇒ *P가 one을 가리키고 one은 다시 two를 그리고 two는 다시 three를 가리킨다. 이것이 연결리스트(Linked list)이다.