引用: C++プログラミングの落とし穴 by Steve Oualline
sub.cpp
char str[] = "Hello World";
main.cpp
# include <iostream>
extern char *str;
int main()
{
std::cout << str << std::endl;
return (0);
}
CentOS6.5で上記cppをコンパイル・実行すると「Segmentation fault(core dumped)」になる。
何故か?
strの定義がchar []とchar *で異なるからということらしい。
プログラムmain()はstrが文字ポインタであると考え、アドレスを期待してその場所から最初の4バイトを読み取る。最初の4バイトは「Hell」であり、それはアドレスではないのでプログラムはクラッシュする。
こういうミスもあるためか、コーディング規約では以下のようにしているものもある。 (引用: 組込みソフトウェアの開発向けコーディング作法ガイド C++言語版])
R3.1.1 (1)配列のextern宣言では要素数を必ず指定する。
上記の場合は
extern char str[12];
にするのだろう。
ただし、Hellow Worldという文字を変更した時、12というサイズを変更する必要があり、その変更忘れというミスを誘発するかもしれない。