WORK/Sotfware
[DEV-C++] [Error] invalid conversion from 'void*' to 'Point2D*' [-fpermissive]
KANG Stroy
2023. 9. 2. 19:36
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