【C/C++】C2440「’初期化中’: ‘const char []’から ‘char *’に変換できません。」の原因と対処法

C/C++のプログラムをコンパイルするとエラーC2440「’初期化中’: ‘const char []’から ‘char *’に変換できません。」と表示されてコンパイル・ビルドに失敗することがあります。

文字列を代入しているだけなのになぜエラーが発生してしまうのか気になると思いますので、できるだけカンタンに解説していきます。

目次から探す

C2440エラーが発生する原因

結論から言うとchar*型変数を別の型の値で初期化できないからです。

float型の値をint型変数に代入するときなど、暗黙的型変換ができる場合は自動的に変換されるのですが、文字列は暗黙的型変換に対応していません。

“sample”などの文字列リテラルはconst char*型なのですが、今回やろうとしているのはchar*型の初期化にconst char*型の値を使おうとしているのでC2440エラーが出てコンパイルに失敗するのです。

char*型を文字列で初期化・代入する方法

ではchar*型をどうやって初期化すれば良いのかという話ですが、簡単な方法が2つあります。

型キャストを行う

強引な方法ですが、最もシンプルな方法です。

#include<stdio.h>
int main() {
    char* str3 = (char*)"sample";
    printf(str3);
    return 0;
}

上記コードのように、代入するconst char*型の文字列リテラルをchar*型にキャスト(明示的変換)することでchar*型変数を初期化できます。

正しく型変換を行えば不具合は起きませんので、char*型を初期化したい場合は型キャストを行うといいでしょう。

char*型に文字列を代入する方法

型キャストを行わずにchar*型に文字列を代入できます。

#include<stdio.h>
int main() {
    char str1[] = "sample";
    char* str2 = str1;
    printf(str2);
    return 0;
}

やっていることは、文字列の配列の先頭のポインタを代入しているだけです。char*型は文字列変数ではなくchar型のポインタに過ぎないため、配列の先頭アドレスを代入することでchar*型に文字列を代入できます。

ポインタだけで本が一冊かけてしまうくらい奥が深いのがポインタですので、ポインタをマスターしたい方はポインタに特化した入門書を読んでみることをおすすめします。

C言語・C++を利用する上でポインタを避けることは不可能に等しいので、C言語・C++を仕事にできるくらい書けるようになりたい方は読んでおくと良いでしょう。

目次から探す