#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