[C언어] 구조체

강지원·2025년 1월 15일

리눅스 기반 C언어

목록 보기
16/24

1. 구조체?

: 여러 자료형을 가진 변수들을 하나로 묶어 자료형으로 사용할 수 있도록 정의하는 것
= 새로운 type을 만들어 내는 것

1-1 구조체 정의

'struct' 뒤에 구조체의 이름을 정해주고, 중괄호 블럭 안에 필요한 변수들을 선언하여 사용한다.

struct student{

        int s_id;
        char name[20];

};

1-2 구조체 사용

먼저, 구조체를 사용하기 전에 선언을 먼저 해줘야 된다.

struct student st1;

변수명 뒤에 '.'을 붙여 구조체 내의 변수에 접근을 한다.

int main(){

        struct student st1;

        st1.s_id = 10;
        strcpy(st1.name, "kang ji won");

        printf("s_id : %d\n", st1.s_id);
        printf("name : %s\n", st1.name);
        printf("struct size : %ld\n", sizeof(st1));

        return 1;
}                              

실행결과

s_id : 10
name : kang ji won
struct size : 24

struct size는 int 4byte, char [20] 20byte이므로 총 24바이트이다.

* 자바에서 클래스의 크기를 재보면 이렇게 딱 용량이 맞지 않는다. 기존 상속되는 부모,.. 등등의 용량을 차지하기 때문이다.

1-3 구조체 쉽게 사용하는 방법

매번 구조체를 사용할 때 위와 같이 선언하면 너무 길고 불편하다.
typedef를 사용하여 구조체를 쉽게 사용할 수 있다.

typedef struct student{
        int s_id;
        char name[20];
} STU;

int main(){
        STU st1;

        st1.s_id = 10;
        strcpy(st1.name, "kang ji won");

        printf("s_id : %d\n", st1.s_id);
        printf("name : %s\n", st1.name);
        printf("struct size : %ld\n", sizeof(st1));

        return 1;
}      

이런식으로 구조체에 STU라는 이름을 붙여 type처럼 사용할 수 있다.

2. 함수에 구조체 넘기기, 포인터

2-1 포인터 사용하지 않을 때

함수호출을 했을 때 메인함수에 접근할 수 없기 때문에 값 복사가 이루어지고 메인함수에 접근하기 위해서는 포인터를 사용해야 한다.

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

typedef struct student{

        int s_id;
        char name[21];

}std;

void std_func(std st);

int main(){

        std st1;

        std_func(st1);

        printf("s_id2 : %d\n", st1.s_id);
        printf("name2 : %s\n", st1.name);
        return 1;
}
void std_func(std st){

        st.s_id = 10;
        strcpy(st.name, "kang ji won");

        printf("s_id1 : %d\n", st.s_id);
        printf("name1 : %s\n", st.name);
}

실행결과

s_id1 : 10
name1 : kang ji won
s_id2 : 1492606976
name2 : �

포인터를 사용하지 않았을 경우에는 메인함수에 접근할 수 없기 때문에 위와 같은 상황이 발생된다.

2-2 포인터 사용

구조체에서 포인터를 사용하기 위해서는

st->s_id  

이런 식으로 '->'를 이용해서 사용해야 한다.

#include <stdio.h>
#include <string.h>
typedef struct student{
		int s_id;
        char name[20];
}std;

void std_func(std * st);

int main(){

        std st1;

        std_func(&st1);

        printf("s_id2 : %d\n", st1.s_id);
        printf("name2 : %s\n", st1.name);
        return 1;
}
void std_func(std * st){

        st->s_id = 10;
        strcpy(st->name, "kang ji won");

        printf("s_id1 : %d\n", st->s_id);
        printf("name1 : %s\n", st->name);
}

실행결과

s_id1 : 10
name1 : kang ji won
s_id2 : 10
name2 : kang ji won

3. 구조체 안에 구조체 가지고 놀기

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

typedef struct human{

        char name[20];
        int age;
        char gender;

}human;

typedef struct student{
        int s_id;
        human man;

}std;
void st_func(std *st);

int main(){

        std st1;
        st1.s_id = 10;
        strcpy(st1.man.name,"jiwon");
        st1.man.age = 25;
        st1.man.gender = 'm';

        printf("s_id : %d\n",st1.s_id);
        printf("name : %s\n",st1.man.name);

        st_func(&st1);

        printf("s_id : %d\n",st1.s_id);
        printf("name : %s\n",st1.man.name);
        return 1;
}
void st_func(std * st){

        st->s_id = 100;
        strcpy(st->man.name, "kang");
}

실행결과

s_id : 10
name : jiwon
s_id : 100
name : kang

0개의 댓글