[C 질문] 이 상황에서 동적할당 해제를 어떻게 시켜야 하나요??

조회수 495회
#include <stdio.h>
#include <stdlib.h>

char *Mystrrev(char *string) {
    int nLength = 0;
    char *Mystr = NULL;

    for(int i = 0; string[i] != '\0'; i++) nLength++;

    Mystr = (char*)calloc(nLength + 1, sizeof(char));
    if(Mystr != NULL) {
        for (int i = 0; i < nLength; i++)
            Mystr[i] = string[nLength - 1 - i];

        Mystr[nLength] = '\0';
    }

    return Mystr;
}

int main(void) {
    char* pastr[3] = { "Hello", "World", "String"};
    char* *ppastr = pastr;

    puts(ppastr[2]);
    puts(Mystrrev(ppastr[2]));

    return 0;
}

안녕하세요!! 이번에 공부하면서 짧게 만든 코드인데요.

동적할당을 하면 꼭꼭 해제를 해야한다고 배웠는데 이런 상황에서는 어느 부분에서(어느 타이밍에서) 해제를 해줘야 하나요??

Mystrrev() 에서 return 하기 전에 해버리면 반환값에 문제가 있을거 같고 그렇다고 main함수에서 하는것도 먼가...흠...

쉬우시겠지만! 짧게 라도 알려주세요 ㅠㅠ!!

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 참고로 제가 알기론 strrev 함수는 표준 함수가 아닙니다. 예전에 도스 시절에 많이 사용되던 함수로, 지금은 이름만 남아 있다고 생각하시면 됩니다. 윈도우즈에선 _strrev 함수를 사용해야 하고, gcc라면 아마도 deprecated 되었을 거에요.

    지금 코드대로라면 main 함수에서 하는게 맞습니다.

    다른 형식으로 하고 싶다면 함수의 프로토타입을 다른 형태로 바꾸어야 합니다.

    또는 매개변수로 넣은 char *string이 지적하고 있는 메모리 공간이 문자열 상수가 아닌 배열 혹은 동적할당 받은 공간이라면 그곳에서 값을 바꾸어도 됩니다. 이런 경우라면 함수 내부에서 동적할당 및 해제가 필요없겠지만 원본이 변경됩니다. 윈도우즈의 _strrev 함수는 이 경우에 해당됩니다. 그래서 _strrev 함수를 바로 사용하지 않고, 원본 문자열을 다른 공간에 복제한 후, 복제된 문자열을 반전시켜서 사용합니다.

    _strrev 함수처럼 동작시키고자 한다면 아래 코드 참고하세요.

    • 코드
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* _Mystrrev(char* string) {
        int len = strlen(string);
    
        char* temp = (char*)malloc(sizeof(char) * (len + 1));
        if (temp != NULL)
        {
            for (int i = 0; i < len; i++)
                *(temp + i) = *(string + len - 1 - i);
    
            *(temp + len) = '\0';
    
            for (int i = 0; i < len; i++)
            {
                *(string + i) = *(temp + i);
            }
    
            free(temp);
        }
    
        return string;
    }
    
    int main(void) {
        char str_hello[] = "Hello";
        char str_hi[] = "hi";
    
        puts(str_hello);
        puts(_Mystrrev(str_hello));
        puts(str_hello);
    
        char* p = (char*)malloc(sizeof(str_hi));
        if (p != NULL)
            memcpy(p, str_hi, sizeof(str_hi));
    
        puts(str_hi);
        puts(_Mystrrev(p));
        puts(str_hi);
    
        free(p);
        p = NULL;
    
        return 0;
    }
    
    • 결과

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)