본문 바로가기
Language/C++

[C] 구조체(struct)와 공용체(union)

by 태옹 2021. 2. 25.

구조체(struct)의 멤버 변수로 배열을 사용할 때 주의사항

 

에러 상황 : 구조체의 멤버 변수인 배열의 시작 주소에 문자열을 입력할 수 없음 

#include <stdio.h>

typedef struct student
{
    char no[10];
    char name[20];
}STUDENT;

int main(void)
{
    STUDENT stu;
    
    stu.no = "2018316"; //에러
    stu.name = "park";	//에러
    
    printf("학번: %s, 이름: %s \n", stu.no, stu.name);
    return 0;
}

 

[해결방법 1] strcpy함수 사용 : 문자열을 대입할 때 사용

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

typedef struct student
{
    char no[10];
    char name[20];
}STUDENT;

int main(void)
{
    STUDENT stu;

    strcpy (stu.no, "20101323");
	strcpy (stu.name, "Park");
    
    printf("학번: %s, 이름: %s \n", stu.no, stu.name);
    return 0;
}

 

[해결방법 2] 구조체의 멤버 변수로 포인터 선언

#include <stdio.h>

typedef struct student
{
    char* no;
    char* name;
}STUDENT;

int main(void)
{
    STUDENT stu;
    
    stu.no = "2018316"; 
    stu.name = "park";
    
    printf("학번: %s, 이름: %s \n", stu.no, stu.name);
    return 0;
}

 

 

 

 

 

구조체 내에서 외부 구조체를 참조하는 코드

(외부 참조 구조체)

#include<stdio.h>
struct point {
	int x; // x좌표
	int y; // y좌표
};
struct student {
	char name[20];
	struct point* link;
};
int main(void)
{
	struct student stu1 = { "Kim", NULL };
	struct student stu2 = { "Lee", NULL };
	struct point p1 = { 30, 40 };
	struct point p2 = { 60, 80 };
	stu1.link = &p1;
	stu2.link = &p2;
	printf("%s %d %d \n", stu1.name, stu1.link->x, stu1.link->y);
	printf("%s %d %d \n", stu2.name, stu2.link->x, stu2.link->y);
	//printf("%s %d %d \n", stu2.name, (*stu2.link).x, (*stu2.link).y);
	return 0;
}

 

 

 

 

 

공용체(union) 이해를 위한 코드

공용체 : 멤버 변수들 중 가장 큰 메모리 공간을 ‘공유’해서 사용

#include<stdio.h>
union point // 공용체 정의
{
	int x;
	int y;
};
struct student // 구조체 정의
{
	int a;
	int b;
};
int main(void)
{
	printf("%d %d \n", sizeof(union point), sizeof(struct student)); //4,8
	union point p; // 공용체변수선언
	p.x = 10;
	printf("%d %d \n", p.x, p.y);
	return 0;
}

 

 

 

 

 

열거형(enum) 이해를 위한 코드

컴파일러는 실제로 열거형 멤버들을 정수형 상수로 인식

효과 : 프로그램의 가독성이 높아짐

#include<stdio.h>
enum week { ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN }; // 열거형 정의
enum season { SPRING, SUMMER = 2/*초기값 할당*/, FALL, WINTER }; // 열거형 정의
int main(void)
{
	enum week p1, p2, p3; // 열거형 변수 p1, p2, p3 선언
	enum season s1, s2, s3, s4; // 열거형 변수 s1, s2, s3, s4 선언

	p1 = ONE;
	p2 = TWO;
	p3 = THREE;

	printf("%d %d %d \n", ONE, TWO, THREE);
	printf("%d %d %d \n", p1, p2, p3);

	s1 = SPRING;
	s2 = SUMMER;
	s3 = FALL;
	s4 = WINTER;

	printf("%d %d %d %d \n", SPRING, SUMMER, FALL, WINTER);
	printf("%d %d %d %d \n", s1, s2, s3, s4);
	return 0;
}
//컴파일러는 실제로 열거형 멤버들을 정수형 상수로 인식
/* 실행 결과 
	0 1 2
	0 1 2
	0 2 3 4
	0 2 3 4 */

댓글