2016년 7월 18일 월요일

구조체 2차원 포인터(2차원 배열)





#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의 수치 보다 더 많은 문자열을 입력하게 하면 다음과 같은 에러 발생



댓글 없음:

댓글 쓰기