Null character
Cのchar型変数には、通常末尾にヌル文字(またはヌル終端文字)と呼ばれる特殊な文字が付く。
ビット表示は "00000000"、 数字で言うと0。
Fortranとの違い・注意点
言葉で説明すると逆に分かりにくくなりそうなので、とりあえずCの関数とFortranのプログラムをコンパイルリンクしたプログラムのソースコードと実行結果を載せる。
Fortranから文字列ポインターstr_src, str_dstをCが受け取ってstr_srcをstr_dstにコピーするというもの。
Case 1: 失敗
C function (func.c)
Fortran program (main.f90)
Output
str_dstはstr_srcと同じように len_trim(str_dst) == 4 となってほしいところだが、実際には len_trim(str_dst) == 7 となってしまう。
なぜかというと、Cでstr_srcをstr_dstにコピーするときにstr_dstの7字目にヌル文字("00000000")が入るからである。7字目なのは、str_srcが6字だから。Fortranではヌル文字は(printでは表示されないものの)他の通常の文字と同じように認識され、その結果str_dstは7字目まで文字が入っているものとみなされる。
Case 2: 成功
C function (func.c)
Fortran program (main.f90)
Output
Cに文字列だけでなく文字列長も渡す。Cでコピーした後、残りの領域に半角スペースを入れる。
文字列長をstrlen等の関数で求めるのではなく引数として渡すのは、FortranとCの仕様の違いによる誤作動を避け、確実に処理を行うためである。Fortranの変数が増えるのはちょっと面倒くさいが、やはりこういった方法が安全なのではないかと思う。ただしCは使い始めて日が浅いので保証はしない。
Fatal error such as "Segmentation Fault"
この例を見ただけでは大した問題ではないように思われるかもしれないが、CやFortranで文字列操作やらなにやら色々な処理を行って、しかもそれをループしていると前のループの結果が影響したり、悪いときにはtrim関数やprint文でSegmentation Faultのような致命的なエラーが発生したりする。
こちらが実際にトラブったとき、gdbでcoreファイルを解析してみたもの。これには参った。文字列操作は丁寧に、確実に。