시냅스

C언어 Struct : 구조체, 구조체 포인터, 구조체 메모리 본문

C

C언어 Struct : 구조체, 구조체 포인터, 구조체 메모리

ted k 2022. 3. 20. 00:20

출처 :http://www.tcpschool.com/c/c_struct_intro

 

구조체

구조체는 여러 정보들을 한 데 묶어주는 역할을 한다.

기본적인 use case 는 아래와 같다.

 

struct Person { // 구조체
    char name[10]; // 구조체 멤버
    int age;
    char address[100];
}

/*
struct Person { // 구조체
	char name[10]; // 구조체 멤버
    int age;
    char address[100];
} p1;
위와 같이 p1을 붙여 줄 경우 바로 p1이라는 변수를 선언한 것
*/

struct Person p1; // 구조체 변수 선언

strcpy(p1.name, "김명수"); // 구조체 멤버에 값 할당
p1.age = 1;
strcpy(p1.address, "서울특별시 강남구")

 

typedef를 통해 struct 키워드를 제외할 수 있는 경우는 아래와 같다.

 

typedef struct _Person // _Person은 구조체 이름
{
    char name[10];
    int age;
    char address[100];
} Person; // 별칭

Person p1; // 구조체 별칭을 통해 변수 선언

 

typedef struct // 구조체 이름을 생략하고
{
    char name[10];
    int age;
    char address[100];
} Person; // 별칭 선언

Person p1; // 별칭을 통해 변수 선언


구조체 포인터

일반적인 포인터와 마찬가지로, 구조체를 가리켜 활용할 수 있다.

메모리를 할당할 때에도 malloc을 사용한다.

 

typedef struct _Person 
{
    char name[10];
    int age;
    char address[100];
} Person;

Person p1;
Person *ptr;

ptr = malloc(sizeof(Person));
// ptr = &p1; 다음과 같이 주소를 대입 해 줄 수도 있다.

p1->age = 30; // 화살표 연산자를 통해 변수를 대입해준다.

 

구조체 메모리

구조체는 멤버 중 가장 큰 자료형의 크기를 배수로 정렬한다.

만약 멤버가 char 1개와, int 한 개일 경우 char의 3byte가 남는데, 이는 남는 공간(패딩)으로 둔다.

 

typedef struct _Person
{
    char a; // 1byte
    int b; // 4byte
} Person;

int main()
{
	Person p1;
    printf("%d", sizeof(p1.a)); // 1
    printf("%d", sizeof(p1.b)); // 4
    printf("%d", sizeof(p1)); // 8 구조체 전체 크기
    printf("%d", sizeof(struct Person)); // 8
}

 

Comments