동적 메모리 할당
//문자열이 여러개인 경우 메모리의 동적 할당
//문자열을 다룰 때 null을 저장해야하므로 +1을 고려하여 할당해야 함.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
int main(){
//1. 포인터 선언
char* p_char =0;
int i = 0;
//2. 메모리 할당
char* a = "welcome";
char* b = "to";
char* c= "Neverland";
//포인터배열
a = (char*)malloc(sizeof(char)*MAX);
b = (char*)malloc(sizeof(char)*MAX);
c = (char*)malloc(sizeof(char)*MAX);
//a = "hello"; FATAL ERROR! 심각한 에러! malloc한 다음에 free를 하지 않고
//포인터를 변경하였기 때문에 메모리 반환을 할 수 없음.
//따라서 a, b, c가 가리키는 메모리영역에 strin을 저장하고 싶은 경우 strcpy를 사용해야한다.
strcpy(a, "Hello"); //null까지 들어가므로 배열사이즈는 null을 고려해서 크기를 정해야 함. +1
strcpy(b, "World");
strcpy(a, "Good Bye")
;
char* arr_str[3] = {a, b, c};
for(i =0; i <3; i++){
printf("%s ", arr_str[i]);
}
printf("\n");
//3. 메모리 반환
free(p_char);
}
//문자열이 여러개인 경우 메모리의 동적 할당
//문자열을 다룰 때 null을 저장해야 하므로 +1을 고려하여 할당해야 함.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
int main()
{
//1. 포인터 선언 ;포인터배열로 선언. 포인터가 여러개이므로 (=스트링이 여러개이므로)
//char* arr_str[3]={0,}; //스택에 포인터배열을 만듦 포인터로 구성된배열
//char arr_char[3]={0,}; //char로 구성된 배열
//char**p_arr_str=arr_str; //힙영역에 포인터배열을 만듦
char **p_arr_str=0;
int count =0;
int i=0;
//사용자에게 이름을 몇개 입력할 건지 물어본다.
printf("입력할 이름의 갯수는 ? \n");
scanf("%d", &count);
printf("입력한 숫자는:%d입니다. \n", count);
//2. 메모리 할당
//포인터배열을 힙영역에 할당한 것임. char* arr_str[3]={0,}와 동일 (스택영역)
//포인터배열은 더블포인터에 담는다.
p_arr_str = (char**) malloc(count*sizeof(char*));
//포인터배열
//row=3이고 col=20인 2차원 배열을 선언한 것과 똑같은 결과
for (i=0; i<count; i++) {
//sizeof(char) =1 sizeof(arr_str[i]) =4 (포인터의 크기는 4이므로)
p_arr_str[i]=(char *)malloc(MAX*sizeof(char));
}
//a="Hello"; FATAL ERROR! : 심각한 에러!.
//malloc한 다음에 free를 하지 않고 포인터를 변경하였기 때문에 메모리반환을 할 수 없음.
//따라서 a,b, c가 가리키는 메모리영역에 string을 저장하고 싶은 경우 strcpy를 사용해야 한다.
//strcpy(arr_str[0], "Hello"); //null까지 들어가므로 배열사이즈는 null을 고려해서 크기를 정해야 함. +1.
//strcpy(arr_str[1], "World");
//strcpy(arr_str[2], "Goodbye");
//scanf_s()를 이용하여 사용자로부터 입력을 받는다.
printf("이름을 %d개 입력하세요. \n",count);
for (i=0; i<count ; i++){
scanf_s("%s", p_arr_str[i], MAX*sizeof(char));
}
printf("입력한 이름은 다음과 같습니다\n");
for (i=0; i<count ; i++){
printf("%s\n", p_arr_str[i]);
}
//3. 메모리 반환
for (i=0; i<count ; i++){
free(p_arr_str[i]);
}
free(p_arr_str);
}
구조체 선언 structure type
: 구조체란? 서로 다른 타입의 데이터를 모아서 한번에 처리할 수 있는 형태
나만의 데이터타입을 만드는 결과임.
다양한 타입의 변수집합을 하나의 타입으로 다룰 수 있다.
구조체를 구성하는 변수를 구조체의 멤버(member)또는 멤버변수(member variable)이라고 부름.
1. 구조체정의 방법1
struct 구조체 이름{
자료형 변수;
}; (;로 끝나야함)
2. 구조체정의 방법2 : typedef를 이용하여 새로운 타입을 정의
typedef struct 구조체이름{
자료형 변수;
} 새로운 타입(별칭);
#include <stdio.h>
#include <string.h>
#define MAX 100
struct struct_Student {
//멤버
int id;
char name[MAX];
}; //;로 끝내야 함.
typedef struct s_Student{
//멤버
int id;
char name[MAX];
} Student; //새로운 타입(별칭) 정의
int main(){
//구조체 변수 선언과 초기화
//1. 형식 : struct 구조체이름 변수;
struct struct_Student student1 = {1001, "son" };
//2. 형식 : 별칭 변수;
Student student2 = {0, };
printf("%d %d\n", sizeof(student1), sizeof(student2));
//3. 출력 (멤버변수 접근)
printf("%d %s\n", student1.id, student1.name );
//4. 대입. 멤버 변수 접근방법
student2.id = 1002;
//name은 배열명, 배열명은 상수, 상수에 상수를 대입못함.
//student2.name = "lee"; ERROR! // name = 상수
//student2.name[0] = 'l'; //변수 char
//student2.name[1] = 'e';
//student2.name[2] = 'e';
strcpy(student2.name, "lee");
printf("%d %s\n", student2.id, student2.name );
}
'C언어 > 복습' 카테고리의 다른 글
[C언어]DAY19_구조체와 리스트, 열거형 상수, 구조체와 함수의 인수 (0) | 2020.02.12 |
---|---|
[C언어]DAY18_ 구조체 배열, 구조체 포인터, 구조체 동적할당 (0) | 2020.02.11 |
[C언어]DAY16_동적 할당, 동적 배열 (0) | 2020.02.10 |
[C언어]DAY15_ 포인터 배열, 더블포인터, 문자열 표준 라이브러리 (0) | 2020.02.10 |
[C언어]DAY14_배열포인터 (0) | 2020.02.05 |