■동적 할당■
코딩할 때 지역변수나 매개변수들을 stack에 저장된다 stack에 저장되면 블록을 빠져나가면 사라지게 된다.
반면, 동적 할당은 heap에 저장되어 free명령을 하기 전까지 살아있다.
(프로그램이 종료되면 운영체제가 알아서 free해준다. 하지만 free를 꼭 해주는 습관이 좋다.(그냥 해라)
아마 free를 안해주고 방대한 양이라면 메모리 누수가 생겨 런타임 에러가 발생하면... 상상도 하기 싫다.)
원형을 보면 void *malloc(unsigned int size); ->size만큼 할당, 시작 위치 반환
(void 포인터를 썻군! 어떤 자료형이 와도 쓸 수 있구만! 대한 casting 해야겟네..)
이외에도 calloc(할당 공간 0으로 초기화), realloc(함수의 크기 조절)도 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<stdio.h> #include<stdlib.h> int main() { char temp[100]; int i; int num=0; char *str[num]; printf("문장의 개수 입력 : "); scanf("%d",&num); fflush(stdin); for(i=1;i<=num;i++) { printf("%d번째 문장을 입력하세요(99글자까지 입력 가능) :",i); gets(temp); printf("\n"); str[i] = (char *)malloc(strlen(temp)+1); //문자열 끝에 넣어줄 null때문에 +1 strcpy(str[i],temp); } for(i=1;i<=num;i++) { printf("%s\n",str[i]); free(str[i]); } printf("출력이 끝났습니다.\n"); system("pause"); return 0; } | cs |
fflush(stdin);는 버퍼를 clear해주는 역할입니다. 이 부분에 대해서는 따로 정리할 겁니다!
간단히 말하자면 버퍼라는 임시 공간이 있는데 키보드로 입력하여 enter 하면 들어갑니다.(공백, 탭, 엔터들도 함께 들어가죠!)
scanf는 공백(스페이스바)을 구분하여 몇 개 인지 구분을 하고 \n(new line)(enter키)를 치면 버퍼에서 가져갑니다.
그래서 예)1 2 3\n
scanf : \n가 있네? \n전까지 가져가야지~ 공백 2개네 3녀석이 들어왔구만!
하고 처리를 합니다. 반면 gets는 문자열을 입력하는 명령어죠! scanf와 다르게 공백까지 저장을 해줍니다.
gets : \n가 있네? 음... 우선 다 가져가자!
라며 "1 2 3"을 들고 옵니다. 하지만 scanf가 가져간 후의 버퍼상태를 보면
버퍼 : \n
되어있어서 gets가 입력 받기도 전에 버퍼에 \n가 남아있기 때문에 아무것도 가져오지 못합니다.
사용자 : (num을 입력했고.. 문장을 입력해볼까? ???뭐야 왜 넘어가지)
gets : \n가 있네? 음... 우선 다 가져가자!(들고 간게 없음..)
이때 fflush(stdin)을 써주면 clear되어 버퍼에 아무것도 남아있지 않습니다.
#끝 말 잇기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include<stdio.h> #include<stdlib.h> #include<string.h> int Check(char **str, char *temp, int count); int main() { char temp[80]; char *str[100] = { 0 }; int i, count; i = 0; while(1) { printf("단어 입력 :"); scanf("%s", temp); if (!strcmp(temp, "end")) break; if( i && (str[i - 1][strlen(str[i - 1]) - 1] != temp[0])) { printf("단어 잇기가 불가능합니다!\n"); continue; } if(!Check(str,temp,i)) { printf("# 이미 존재하는 단어입니다!\n"); continue; } str[i] = (char *)malloc(strlen(temp) + 1); if(str[i] == NULL) { printf("> 메모리 부족...\n"); break; } strcpy(str[i], temp); i++; } count =i; for(i=0;i<count;i++) { printf("%s ",str[i]); free(str[i]); } system("pause"); return 0; } int Check(char **str, char *temp, int count) { int i; for(i=0;i<count;i++) { if(!strcmp(str[i],temp)) return 0; } return 1; } | cs |
'C 언어' 카테고리의 다른 글
[C언어_Day9]파일 입출력 (0) | 2018.10.11 |
---|---|
[C언어_Day8]마방진 + 주민등록번호 검사 (0) | 2018.10.11 |
[C언어_Day6]함수 포인터 + Void 포인터 (0) | 2018.10.11 |
[C언어_Day5]명령 인수, 포인터 사용 (0) | 2018.10.11 |
[C언어_Day4]String 예제 (0) | 2018.10.11 |