#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의 수치 보다 더 많은 문자열을 입력하게 하면 다음과 같은 에러 발생
'C' 카테고리의 다른 글
C언어에서 2차원 배열인 "포인터의 배열"에 대해서 (0) | 2016.08.03 |
---|---|
구조체 변수와 구조체 포인터 변수의 멤버변수 접근법 (0) | 2016.07.28 |
C언어에서 enum 사용하기 (0) | 2016.07.27 |
2차원 배열인 "배열의 포인터"와 scanf 활용 (0) | 2016.07.08 |