동적할당 사용한 코드 오류입니다!..

조회수 4254회
#include<stdio.h>
#include<stdlib.h>
void main(void)
{
    char *mes;
    char *mes2;
    char *mes3;
    int i, j,temp=1;

    FILE *fp = fopen("Readme.txt", "rb");
    FILE *fp2 = fopen("readm.txt", "wb");
    long dw;


    if (fp)
    {
        dw = ftell(fp);
        fseek(fp, 0, SEEK_END);
        dw = ftell(fp);
        mes = (char*)malloc(dw);

        fseek(fp, 0, SEEK_SET);
        fread(mes, 1, dw, fp);
        for(i=0;i<dw;i++)
            if (mes[i] == 'i' && mes[i + 1] == 's')
            {
                mes2 = (char*)malloc(dw + temp);
                mes2 = mes;
                mes2[i] = 'a';
                mes2[i + 1] = 'r';
                memmove(mes2 + i + 3, mes2 + i + 2, strlen(mes2) - i + 3);
                mes2[i + 2] = 'e';
                temp++;
                free(mes2);



        }
        mes = (char*)malloc(dw + temp);
        mes = mes2;
        printf("mes:%s\n", mes);

    }

    free(mes2);
    free(mes);
    fclose(fp);
    fclose(fp2);
}

동적할당을 사용해서 txt파일에 is라는 글자을 are로 바꿀려고 합니다.. 그런데 계속 오류가 뜨네요 어떻게 고쳐야될지 알고싶습니다!..

1 답변

  • 에러메세지 "pointer being freed was not allocated"가 나는걸 말하시는건가요? 이 에러는 "네가 free하려는 pointer에는 아무것도 할당된게 없어!"라는 뜻입니다. 코드를 보니 mes2와 mes를 두번 free하네요.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void)
    {
        char *mes = NULL;
        char *mes2 = NULL;
        char *mes3 = NULL;
        int i, j,temp=1;
    
        FILE *fp = fopen("File.txt", "rb");
        long dw;
    
        if (fp)
        {
            dw = ftell(fp);
            fseek(fp, 0, SEEK_END);
            dw = ftell(fp);
            mes = (char*)malloc(dw);
    
            fseek(fp, 0, SEEK_SET);
            fread(mes, 1, dw, fp);
            for(i=0;i<dw;i++)
                if (mes[i] == 'i' && mes[i + 1] == 's')
                {
                    mes2 = (char*)malloc(dw + temp);
                    mes2 = mes;
                    mes2[i] = 'a';
                    mes2[i + 1] = 'r';
                    memmove(mes2 + i + 3, mes2 + i + 2, strlen(mes2) - i + 3);
                    mes2[i + 2] = 'e';
                    temp++;
                    free(mes2);  // 여기서 mes2를 프리합니다.
    
    
                }
            mes = (char*)malloc(dw + temp);
            mes = mes2;
            printf("mes:%s\n", mes);
    
        }
    
        free(mes2); // 위에서 free한 mes2를 또 프리하려니 에러가 나겠지요?
        free(mes); // mes는 mes2와 같은 값을 가지는데, 위에서 이미 mes2를 프리했으므로 에러가 납니다.
        fclose(fp);
    }
    

    마지막 free(mes2); free(mes); 를 지우면 에러는 나지 않을거에요. 또, 코드에 불필요한 변수가 있고, 메모리 누수가 있네요!

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)