구조체 변수와 구조체 포인터 변수의 멤버변수 접근법

다음과 같은 구조체가 있다고 할때


typedef struct

{

int price;

int count;

} Item;


Item item; //구조체 변수

Item *ptrItem; //구조체 포인터 변수

ptrItem = &item;


일반적인 구조체 변수가 있고, 구조체 포인터 변수가 있다.

일반적인 구조체 변수가 구조체 멤버 변수에 접근코자 할 때는 . 연산자로 접근하고

예) item.price = 100;


반면에 구조체 포인터 변수가 구조체 멤버 변수에 접근코자 할 때는 -> 연산자로 접근한다.

예) ptrItem->price = 100;


아래는 샘플 코드이다.


#include <stdio.h>


typedef struct

{

char name[20];

int price;

int count;

} Item;


void main()

{

Item item = {"수박", 100, 30}; //item은 구조체 변수

Item *ptrItem; //ptrItem은 구조체 포인터 변수


ptrItem = &item;


printf("%s\n", item.name);

printf("%d\n", item.price);

printf("%d\n\n", item.count);


printf("%s\n", ptrItem->name);

printf("%d\n", ptrItem->price);

printf("%d\n", ptrItem->count);

}





#include <stdio.h>

#include <malloc.h>


struct MySMS

{

//이거 자체가 1차원 배열을 구성

//char형 포인터로 선언한 것은 실행 타임에서 메시지의 길이를

//동적으로 지정하겠다는 뜻임.

char *message;


//여기서 아래와 같이 배열로 입력 받을 문자열 갯수를 지정할수도 있으나

//이렇게 되면 메시지의 길이에 따라 메모리가 낭비되거나

//메시지 내용이 잘릴수 있다.

//char message[50];

};


void main()

{

int row;

int col;


//아래와 같이 선언하는 건 2차원 배열이라는 뜻

//2차원 배열 중에서 행도 가변, 열도 가변의 2차원 포인터가 되시겠다.

//혹은 이런 식도 가능 하겠다.

//struct MySMS arr[10]; //이렇게 하면 열의 갯수는 가변이나

//행의 갯수가 고정이 되는 형태인데 이를 '포인터의 배열'이라고 한다.

//arr[0].message = (char*)malloc(sizeof(char) * 10); //문자열 9개를 받겠다는 뜻

struct MySMS *obj = NULL;


printf("메시지 갯수(행의 갯수) 입력 : ");

scanf("%d", &row);


//2차원 배열 중 행(row)의 갯수

//배열과 달리 실행 타임에 동적으로 크기를 결정 가능.

obj = (struct MySMS *)malloc(sizeof(MySMS) * row);


printf("문자열 갯수(열의 갯수) 입력 : ");

scanf("%d", &col);


//입력한 수치 만큼 실제로 문자열(메시지) 입력 받기 위해

//맨 끝에는 문자열의 끝을 나타내는 널 문자(\0)가 들어가기 때문이다.

col++; 

obj[0].message = (char*)malloc(sizeof(char) * col);


//printf("사이즈 : %d\n", sizeof(char) * 6); //이건 6 byte

//printf("사이즈 : %d\n", sizeof(char*) * 6); //이건 24 byte


scanf("%s", obj[0].message);

printf("%s\n", obj[0].message);


//아래와 같은 순으로 반드시 메모리 해제를 해줘야 된다.

free(obj[0].message);

free(obj);

}


만일 위의 scanf("%d", &col);에서 입력한 col의 수치 보다 더 많은 문자열을 입력하게 하면 다음과 같은 에러 발생





+ Recent posts