char *history[BUFFER_SIZE];
は、char*
の配列で、どこも指していません。それらのポインタにstrncpy
をしようとすると、未定義のビヘイビアが呼び出されます(これはどこにも指していないため)、これはセグメンテーションとして表示されています。
ときhistory[0] = "a string"
これはhistory[0]
でchar*
を割り当て、そのhistory[0]
もはやポインタがどこにも、それは"a string"
を指していないし。 "a string"
はプログラム内の他の場所に格納されている文字列リテラルです。ほとんどの場合、読み取り専用セクションです。 history[0]
は実際にはデータ"a string"
を含んでおらず、単に"a string"
のアドレスを含んでいます。
私はこのようなchar型の配列の配列を定義しておりますので、私は は正しい、malloc関数または初期化の任意の並べ替えを実行する必要はありませんか?
あなたのやりたいことによって異なります。 history[0] = "a string"
を実行するのはまったく問題ありません。文字列リテラルなので、その文字列を変更しようとすると未定義の動作であることがわかります。文字列リテラルを、自由にコピーを変更できるメモリセクションにコピーする場合は、malloc
またはそれに類するメモリを割り当てる必要があります。しかし、char *history[BUFFER_SIZE];
は "char
配列の配列"を定義していないので、char
ポインタの配列を定義しています。
'history [0] =" a string "は*文字列リテラル*へのポインタです。 'strncpy'または他の方法でそれに書き込むことは、いいえいいえです。しかし、疑問は不明です。 'history [0 ...]'にメモリを割り当ててデータをコピーすることができない場合、 'strncpy(history [0]、str、length);'は失敗します。 –