본문 바로가기
개념/혼자 공부하는 C언어

chapter 16) 3개의 문자열을 저장하기 위한 동적 할당

by kiseno 2024. 9. 24.
728x90
반응형
SMALL
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char temp[80];
    char *str[3];
    int i;

    for (i = 0; i< 3; i++){
        printf("write string : ");
        gets(temp);
        str[i] = (char * )malloc(sizeof(strlen(temp) + 1));
        strcpy(str[i], temp);
    }

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

    for (i = 0 ; i< 3; i++){
        free(str[i]);
    }
    return 0;
}

 

1. **문자열 입력 받기**: 
    - 사용자로부터 3개의 문자열을 입력 받습니다. 각 문자열은 `temp` 배열을 통해 임시로 저장됩니다.
    - **주의**: `gets()` 함수는 안전하지 않습니다(버퍼 오버플로우 취약성이 있습니다). `fgets()` 함수로 대체하는 것이 좋습니다.

2. **동적 메모리 할당**:
    - `str[i] = (char *)malloc(sizeof(strlen(temp) + 1));`에서 `strlen(temp) + 1`는 입력받은 문자열의 길이에 널 종료 문자(`\0`)를 포함한 크기를 계산합니다. 그러나 `sizeof` 연산자는 잘못 사용되었습니다. `sizeof`는 타입이나 타입의 인스턴스의 크기를 바이트 단위로 반환하는 연산자이므로, 이 경우에는 `strlen(temp) + 1` 자체가 필요한 바이트 수를 제공합니다.
    - 올바른 코드는 `str[i] = (char *)malloc(strlen(temp) + 1);`입니다.

3. **문자열 복사**:
    - `strcpy(str[i], temp);`를 사용하여 `temp`에 저장된 문자열을 `str[i]`가 가리키는 메모리 공간에 복사합니다.

4. **문자열 출력**:
    - 입력받고 메모리에 저장된 각 문자열을 출력합니다.

5. **메모리 해제**:
    - 할당된 메모리는 더 이상 필요하지 않으므로 `free(str[i]);`를 사용하여 해제합니다.

728x90
반응형
LIST