■동적 할당■


코딩할 때 지역변수나 매개변수들을 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


+ Recent posts