入力してもエラーは発生しません
char a[10] = "Hi";
しかし、次のように変更すると、エラーが発生します。Array type char is not assignable.
char a[10];
a = "Hi";
配列型charが割り当てられないのはなぜですか?言語が意図的にそのように書かれているからですか、それとも私はポイントを逃していますか?
入力してもエラーは発生しません
char a[10] = "Hi";
しかし、次のように変更すると、エラーが発生します。Array type char is not assignable.
char a[10];
a = "Hi";
配列型charが割り当てられないのはなぜですか?言語が意図的にそのように書かれているからですか、それとも私はポイントを逃していますか?
配列は変更可能な左辺値ではありません
使用する
char a[10];
strcpy(a, "Hi");
上でコメントしたように、これを行うC ++の方法は、のstd::string
代わりにを使用することですchar[]
。これにより、期待する割り当て動作が得られます。
とはいえ、2番目のケースでのみエラーが発生する理由は=
、これら2行のが異なる意味を持つためです。
char a[10] = "Hi";
a = "Hi";
1つ目は初期化で、2つ目は割り当てです。
最初の行は、スタックに10文字を保持するのに十分なスペースを割り当て、それらの文字の最初の3つを「H」、「i」、および「\0」に初期化します。この時点からa
、スタック上のアレイの位置を参照するだけです。配列はスタック上の単なる場所であるため、a
変更することはできません。スタック上の別の場所に別の値を保持する場合は、別の変数が必要です。
一方、2番目の(無効な)行は、a
の(技術的に異なる)呪文を参照するように変更しようとし"Hi"
ます。上記の理由により、これは許可されていません。初期化された配列を取得したら、それを使用して実行できるのは、配列から値を読み取り、配列に値を書き込むことだけです。その場所やサイズを変更することはできません。この場合、割り当てはそれを実行しようとします。
この言語では、文字配列に文字列リテラルを割り当てることはできません。strcpy()
代わりに次を使用する必要があります。
strcpy(a, "Hi");
a は、配列自体ではなく、配列へのポインターです。再割り当てすることはできません。
あなたは C++ BTW でタグ付けしました。その場合は、std::string を使用することをお勧めします。それはおそらくあなたが期待しているもの以上です。
シンプルに、
char a[10] = "Hi";
実行時にそのように行うことはできないため、少し「追加機能」です。
しかし、それが C/C++ 標準ライブラリの理由です。
#include <string.h>
// ...
strcpy(a,"Test"); // STR-ing C-o-PY.
これは C の標準ライブラリに由来します。C++ を使用している場合は、目的の PC から最大限のパフォーマンスを引き出したい場合を除き、std::string を使用する必要があります。
これは、初期化が割り当てではないためです。最初に動作するのは初期化であり、動作しない 2 番目の動作は期待どおり代入です。strcpy
またはのように sth を使用する必要がある配列に値を割り当てることはできませんmemcpy
。std::copy
または、代わりにから使用することもできます<algorithm>
それはとても単純です、(=)は2つの異なる平均代入と初期化を持っています。そのようなコードを書くこともできます
#include <iostream>
using namespace std;
int main ()
{
char message[3] = {'H', 'i', '\0'};
cout << message<< endl;
return 0;
}
このコードでは、難しいコードや関数を書く必要はなく、string.hも必要ありません。