【C言語】
mallocにキャストは
今時のCコンパイラでは必要ない

error C2440: ‘初期化中’: ‘void *’ から ‘char *’ に変換できません。

警告:C言語なのにC++コンパイラ使ってる?


■51年前のK&Rコンパイラを使ってる?

void  K_R_style(const char *src){
	char *dst;

	dst = (char*)malloc(strlen(src)+1);
	if(dst == NULL){
		perror(NULL);
		return 	;
	}
	strcpy(dst,src);
	puts(dst);
	free(dst);
}

(1)4行目でキャストが必要なコンパイラは
K&Rという古いコンパイラかもしれません。
⇒そんな古いコンパイラはスミソニアン博物館に寄付しましょう。

(1)4行目でキャストが必要なコンパイラは
C++コンパイラかもしれません。
⇒Visual Studio使用者でC言語のつもりでC++コンパイラを起動している場合がありました。

(3)将来CからC++へ移行するかもしれないので今からキャストすると言う人はYAGNI原則
勉強しましょう。


■C99仕様のコンパイラではmallocにキャスト不要

void 	C99_style(const char *src){
	char *dst = malloc(strlen(src)+1);
	if(dst == NULL){
		perror(NULL);
		return 	;
	}
	strcpy(dst,src);
	puts(dst);
	free(dst);
}

まとめ(コンパイル可能)

#define 	_CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//古いK&R年代のmalloc()スタイルか
//別の言語C++のmalloc()スタイル
//※C++ではmalloc/freeは通常使わないんだけど。。。。
void  K_R_style(const char *src){
	char *dst;

	dst = (char*)malloc(strlen(src)+1);
	if(dst == NULL){
		perror(NULL);
		return 	;
	}
	strcpy(dst,src);
	puts(dst);
	free(dst);
}

//C99仕様のmalloc()スタイル
void 	C99_style(const char *src){
	char *dst = malloc(strlen(src)+1);
	if(dst == NULL){
		perror(NULL);
		return 	;
	}
	strcpy(dst,src);
	puts(dst);
	free(dst);
}
int main(void){
	K_R_style(__func__);
	C99_style(__func__);
}

(1)K&Rコンパイラではコンパイルできません。
constとかvoidは昔は無かったので。

(2)C++コンパイラではコンパイルできません。
Cコンパイラを使って下さい。