구조체(typedef, struct), 연결리스트
- 구조체
⇒ 의미상으로 연관된 여러 데이터를 하나의 이름으로 묶은 사용자 정의 자료형으로, 여러 가지 속성을 가지고 있는 개체를 정의할 수 있다.
⇒ 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");
}
⇒ 출력결과
'내장형 하드웨어 > C언어' 카테고리의 다른 글
C언어 복습(디버깅, 어셈블리 소스 작성) (0) | 2011.06.15 |
---|---|
ATmega128 spec2, C언어 복습2(디버깅) (1) | 2011.06.14 |
함수 포인터(function pointer), 배열 (0) | 2011.05.09 |
수학 함수 (math.h), 난수 생성 함수(랜덤 함수) rand - srand, seed, time(NULL) (0) | 2011.05.06 |
함수 전달의 3가지 - 참조(reference), 주소(address), 값(value), 재귀함수, touch, ifndef (0) | 2011.05.04 |