4
これは未定義の動作ですか?配列に文字列リテラルを割り当てる
char *a = "hello";
char b[] = "abcd";
a = b;
コンパイラは、最大警告レベルで警告をスローしません。
これは未定義の動作ですか?配列に文字列リテラルを割り当てる
char *a = "hello";
char b[] = "abcd";
a = b;
コンパイラは、最大警告レベルで警告をスローしません。
ここにはUBはありません。代わりに、配列の先頭のアドレスを指すポインタを単に代入するだけです。あなたが実際にa
は、唯一a
自体、およびa
で指している値を変更していない
注意通常char *
です。
「こんにちは」はどうなりますか? – cheroky
@cheroky、あなたがそのメモリを割り当てていたなら、決してそれを解放することができないので、メモリリークになります。しかし、それはコンパイラによってメモリが割り当てられた文字列リテラルなので(リードオンリー領域の可能性が高い)、それを決して解放することはできないため、ポインタを持たないことは無関係です。 – merlin2011
ありがとう、ありがとう – cheroky