「はははは」という単語の最初の文字を指す string1 という名前の char ポインターがあるとします。string1 が指す文字列と同じ文字列を含む char[] を作成したいと考えています。
これが機能しないのはなぜですか?
char string2[] = string1;
「どうしてうまくいかないの?」
それは C 言語が定義された方法ではないからです。
[ ANSI Cstrdup()
ではないことに注意]を使用してコピーを作成できます。strdup()
参照:
あなたがこのように書くもの:
char str[] = "hello";
...実際には次のようになります。
char str[] = {'h', 'e', 'l', 'l', 'o'};
ここでは、初期化子と呼ばれるものを暗黙的に呼び出しています。
上記のシナリオでは、イニシャライザが文字配列の作成を担当します。
初期化子は、舞台裏でこれを行います。
char str[5];
str[0] = 'h';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
C は非常に低レベルな言語です。あなたの声明:
char str[] = another_str;
C では意味がありません。C では、配列全体を別の配列に割り当てることはできません。手動で、または strcpy() 関数を使用して、文字ごとにコピーする必要があります。another_str
上記のステートメントでは、初期化子は配列変数の長さを知りません。を入れる代わりに文字列をハードコーディングすると、うまくいきanother_str
ます。
他のいくつかの言語では、そのようなことができるかもしれません... しかし、マニュアル車が自動的にギアを切り替えることは期待できません。あなたはそれを担当しています。
1) ポインター string2 == ポインター string1
どちらかの値を変更すると、もう一方が変更されます
ポスターポイダより
char string1[] = "hahahahaha";
char* string2 = string1;
2) コピーを作成する
char string1[] = "hahahahaha";
char string2[11]; /* allocate sufficient memory plus null character */
strcpy(string2, string1);
どちらかの値が変化しても、もう一方は変化しません
Cでは、文字列を保持するためにメモリを予約する必要があります。
これは、定数文字列を定義してから char[] に割り当てると、自動的に行われます。
一方、 を記述するとき、string2 = string1
実際
に行っているのは、charオブジェクトへのポインタのメモリ アドレスを割り当てることです。が(pointer-to-char) string2
として宣言されている場合、代入は有効です。char*
char* string2 = "Hello.";
変数string2
は、char "Hello." の定数配列の最初の文字のアドレスを保持するようになりました。
string2
が achar*
でstring1
が aの場合、 string2 = string1 と書いても問題ありませんchar[]
。
ただし、 achar[]
はメモリ内に一定のアドレスを持つと想定されています。変更不可です。
したがって、次のような文を書くことは許可されていません。
char string2[];
string2 = (something...);
ただし、string2 は文字の配列であるため、string2 の個々の文字を変更できます。
string2[0] = 'x'; /* That's ok! */