Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 메모리 동적 할당 (문자열) 본문

C언어

C언어 - 메모리 동적 할당 (문자열)

깅햄찌 2022. 9. 22. 20:37
반응형

안녕하세요 오늘은 메모리 동적 할당 3탄 동적 할당을 이용하여

문자열 처리하는 법을 정리해보겠습니다.

 

이전 메모리 동적 할당 포스팅도 참고해주세요~

2022.09.20 - [C언어] - C언어 - 메모리 동적 할당 (malloc)

 

C언어 - 메모리 동적 할당 (malloc)

안녕하세요 오늘은 메모리 동적 할당에 대해 정리해보겠습니다. 일반적인 정적 할당은 Compile 단계에서 할당되지만 동적 할당은 runtime 시 메모리에 할당되는 특징이 있는데요. 먼저 메모리 동적

leggo-fire.tistory.com

2022.09.21 - [C언어] - C언어 - 메모리 동적 할당 (calloc, realloc)

 

C언어 - 메모리 동적 할당 (calloc, realloc)

안녕하세요 오늘은 메모리 동적 할당 2탄 calloc과 realloc에 대해 정리해보겠습니다. 2022.09.20 - [C언어] - C언어 - 메모리 동적 할당 (malloc) C언어 - 메모리 동적 할당 (malloc) 안녕하세요 오늘은 메모리.

leggo-fire.tistory.com

첫 번째 예제로 동적 할당(malloc)을 이용해 문자열을 출력해보겠습니다.  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char temp[50];
    char *str[4];

    for(int i=0; i<4; i++){
        printf("input string : ");
        gets(temp);
        str[i] = (char *)malloc(strlen(temp) + 1); // +1 for NULL
        strcpy(str[i], temp);
    }

    for(int i=0; i<4; i++){
        printf("str[%d] : %s\n",i,str[i]);
    }

    for(int i=0; i<4; i++){
        free(str[i]);
    }

    return 0;
}

1. 문자열을 입력받고 문자열의 길이 +1 (NULL문자 포함해야 하기 때문)만큼  동적 할당해줍니다. 

2. 포인터 배열의 요소(str[i])가 입력받은 문자열을 가리키게 합니다. 

3. 아래 결과와 같이 포인터 변수 str[i]로 문자열에 접근할 수 있는 걸 확인했습니다. 

 

두 번째 예제로 동적 할당(malloc)된 문자열을 함수로 출력해보겠습니다. 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void print_str(char **ps){
    while(*ps != NULL){
        printf("%s\n",*ps);
        ps++;
    }
}

int main(){
    char temp[50];
    char *str[5];

    for(int i=0; i<5; i++){
        printf("input string : ");
        gets(temp);
        if(strcmp(temp,"end") == 0) break; //input "end" will exit the loop
        str[i] = (char *)calloc(strlen(temp)+1,sizeof(char)); // +1 for NULL
        strcpy(str[i], temp);
    }

    print_str(str);

    for(int i=0; str[i]!=NULL; i++){
        free(str[i]);
    }

    return 0;
}

1. 위의 예제와 같이 문자열을 입력받고 포인터 변수가 문자열을 가리키게 합니다. 

2. 2개의 매개변수의 동일성을 확인하는 strcmp함수를 이용해 "end"를 문자열로 입력할 경우 for문을 빠져나가게 합니다. 

3. print_str 함수는 포인터 배열을 매개변수로 받아 이차 포인터를 이용해 문자열에 접근합니다. 

3.1. 포인터 변수가 가리키는 게 있다면 출력하고 없다면(NULL) 출력을 끝냅니다. 

4. 아래 결과처럼 입력된 문자열을 출력하고 "end"를 입력하자 for문을 빠져나가 출력을 끝낸 것을 확인할 수 있습니다. 

 

추가로 리눅스를 공부하다 보면 main함수에 매개변수가 있는 경우를 볼 수 있는데

위의 예제와 동일한 기능을 하는 것을 알 수 있습니다.

함수의 내부가 어떻게 만들어졌는지 유추해볼 수 있겠죠?

#include <stdio.h>

int main(int argc, char **argv){

    printf("argc : %d\n",argc);
    for(int i=0; i<argc; i++){
        printf("argv[%d] : %s\n",i,argv[i]);
    }

    return 0;
}

1. argc는 매개변수의 수

2. argv는 매개변수를 담는 문자열 배열

3. 아래 결과와 같이 코드 실행 명령 포함 argc는 4, argv는 매개변수를 그대로 할당받았음을 확인할 수 있습니다. 

오늘은 동적 할당을 이용하여 문자열 처리하는 법을 정리해보았습니다.

위의 예제들이 동적 할당을 이해하는데 도움이 되셨길 바라며 다음 포스팅에서 만나요~~

Comments