【C言語】
C99仕様のコンパイラでは mallocの戻り値にキャストは必要ない

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

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


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

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

int main(void){
	char *str;
	int num;
	int i;

	printf("1から26の数字をどれか入力して下さい\n");
	scanf("%d", &num);

	str = (char *) malloc(sizeof(char) * (num + 1));
	if (!str) {
		perror("メモリが確保できませんでした。\n");
		return -1;
	}

	for (i = 0; i < num; i++) {
		str[i] = 'a'+ i ;
	}
	str[num] = '\0';

	printf("%d文字の:%s:を生成しました。\n",num,str);

	free(str);

	return 0;
}

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

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

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


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

#include <stdio.h>
#include <stdlib.h>
int main(void){
	printf("1から26の数字をどれか入力して下さい\n");
	size_t	num;
	scanf("%zu", &num);

	char *str = malloc(num + 1);
	if (str == NULL) {
		perror("メモリが確保できませんでした。\n");
		return -1;
	}

	for (size_t i = 0; i < num; i++) {
		str[i] = 'a' + i;
	}
	str[num] = '\0';
	printf("%zu文字の:%s:を生成しました。\n",num,str);

	free(str);
}