본문 바로가기
WORK/Sotfware

[DEV-C++] [Error] invalid conversion from 'void*' to 'Point2D*' [-fpermissive]

by KANG Stroy 2023. 9. 2.
728x90
728x90

DEV C++ 을 사용하다 보면 아래와 같은 에러가 발생했습니다. 

main.c [Error] invalid conversion from 'void*' to 'Point2D*' [-fpermissive]

C 언어 메모리와 구조체에 대한 부분이였습니다. ( https://dojang.io/mod/page/view.php?id=438 ) 이 부분의 예제 입니다. 분명 되어야 하는 간단한 예제 입니다. 그런데 위와 같은 에러가 발생 합니다. 

이유는 C와 C++ 에대한 문제 였더군요. 

예제는 

#include <stdio.h>
#include <string.h>    // memset 함수가 선언된 헤더 파일

struct Point2D {
    int x;
    int y;
};

int main()
{
    struct Point2D p1;

    memset(&p1, 0, sizeof(struct Point2D));    // p1을 구조체 크기만큼 0으로 설정

    printf("%d %d\n", p1.x, p1.y);    // 0 0: memset을 사용하여 0으로 설정했으므로
                                      // x, y 모두 0 
    return 0;
}

정말 간단하죠. 에러가 날 부분이 없습니다. 

해결 방법으로 C 언어 코딩 도장 입니다. 

( https://dojang.io/mod/forum/discuss.php?d=101 )
포인터 관련 오류: 'void *'에서 'int *'(으)로 변환할 수 없습니다

주로 Unit 34~38 사이에서 발생하는 문제입니다.Visual Studio에서 소스 파일 확장자를 .cpp로 했을 때 발생하는 문제입니다. 파일 확장자가 .cpp이면 Visual Studio는 C++ 언어로 컴파일합니다. 파일 확장자를 .c로 지정해야 C 언어로 컴파일합니다. C 언어와 C++ 언어는 메모리 관리에서 다른 부분이 있습니다. 책이 잘못된 게 아닙니다. 확장자를 .cpp로 지정해서 C++에서 C 언어를 작성하는 것이 잘못입니다. C 언어는 파일 확장자를 .c로 해야 합니다. 
해결책1: Visual Studio에서 소스를 생성할 때 확장자를 .c로 해주세요. hello.cpp가 아니라 hello.c로 해야 합니다.

// C++ 방식, 타입 변환하는 건 C++ 방식입니다. C 언어에서 C++ 방식을 쓰면 안 됩니다.
// C++은 malloc에서 형변환을 직접 지정해야 합니다.
int *ptr = (int*)malloc(sizeof(int));

// C 언어 방식, 소스 파일 확장자를 .c로 해야 합니다. // C 언어는 malloc에서 형변환을 자동으로 해줍니다.
int *ptr = malloc(sizeof(int));

DEV C 에서 프로젝트를 생성 할 때 다음에 대한 부분을 확인 한 후 실행 하시면 되겠습니다. 

C 언어 코딩 도장에서 malloc 을 사용하기 위해서는 C project를 선택하시면 되겠습니다. 

// C++ 방식, 타입 변환하는 건 C++ 방식입니다. C 언어에서 C++ 방식을 쓰면 안 됩니다.
// C++은 malloc에서 형변환을 직접 지정해야 합니다.
int *ptr = (int*)malloc(sizeof(int));

// C 언어 방식, 소스 파일 확장자를 .c로 해야 합니다. // C 언어는 malloc에서 형변환을 자동으로 해줍니다.
int *ptr = malloc(sizeof(int));

위의 글을 다시 가져왔습니다. 아시겠나요? 

설명은 모르겠다면, 프로젝트를 만들때 C project로 하시면 되겠습니다. 

728x90

댓글