유닉스를 이용한 C 질문 argv

조회수 101회

gcc를 이용해 a.out을 만들어서 예를들면 a.out 10 xyz를 입력하면 10을 동적 할당 하고 난 후 argv에 있는 xyz 값을 저장하려고 합니다. 프린트가 끝나고 free를 해주면 munmap_chunk(): invalid pointer Aborted (core dumped) 에러가 발생합니다. 이유가 무엇일까요 ?

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

int main(int argc, char *argv[])
{
        if (argc >= 3)
        {
                int n;
                n = atoi(argv[1]);
                char *ptr = (char *)malloc(sizeof(char) * n);
                ptr = *(argv+2);
                printf("Size = %d\n", n);
                printf("Data = %s\n", ptr);
                free(ptr);
        }

        else
        {
                printf("argument errors\n");
        }
}

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    C 언어의 문자열은 char형 배열의 시작 주소입니다. = 연산자는 문자열을 복사하는 것이 아니고 다른 주소값을 복사할 뿐입니다.

    실제로 해야할 것은 for 루프를 돌려서 한글자씩 모두 대입하시거나, string.h의 strcpy 함수를 사용해서 복사해야 합니다.

    ptr = *(argv + 2);
    

    위 코드를 아래와 같이 수정하시면 됩니다.

    strcpy(ptr, argv[2]);
    

    추가로 상단에 #include <string.h> 추가해야 합니다.

    • 다른 주소값이라는 말이 무슨뜻인가요? GO-TE 2022.11.23 00:18
    • 값을 저장하는 일반 변수와 달리, 포인터는 주소값을 저장하는 특수한 변수입니다. 포인터 변수에 대입연산자를 사용하면 포인터 변수에 다른 변수 또는 상수의 주소값을 복사하여 저장하는 것입니다. cheolsu 2022.11.23 00:57
    • 제가 말을 잘 이해 하였다면 저 위 같은 경우는 ptr이 argv[2]의 주소값만 저장할 뿐 argv[2]의 값인 문자열이 아니란 뜻이죠 ? 감사합니다 GO-TE 2022.11.24 10:26
    • ptr은 최초에 malloc함수가 반환한 동적할당 받은 주소값 가지고 있었는데. 그 동적할당받은 메모리안에 문자를 넣어야 하는 것인데, ptr에 argv[2]를 대입하면 2번째 명령줄인수인 문자열의 주소값이 저장되고 동적할당 받은 메모리는 접근할수 없는 누수상태가 됩니다. 일단 이것이 큰 문제이구요. 에러가 발생한 이유는 free로 해제 해 줄수 있는 메모리는 malloc으로 할당 받은 메모리여야 하는데, argv[2]를 대입한 순간 다른 메모리주소를 가르키고 있고, 해제 할수 없는 그 메모리를 해제할려고 시도했기 때문에 에러가 난 것입니다. cheolsu 2022.11.24 10:55

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

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.