『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]
3.3 仮引数としての配列宣言 P37におけるP68への参照を確認しました。
externにより他のファイルで変数を使う場合はポインタと配列をきちんと区別すべきという内容です。同じファイル内のポインタや配列への自動変換のような補助はありません。
下記例ではextern helloポインタになっているため、”配列helloへのポインタ”格納アドレスへアクセスしようとしますが、そのようなものは存在しないのでBus errorになります。
このようなミスは初級者を脱したばかりの中級者がやってしまいそうな感じがします。
#include <cppstd.h>
#include <test2.h>
char hello[] = "hello";
int main() {
show();
return 0;
}
#include <cppstd.h>
// extern char hello[]; // 正しくはこちら
extern char *hello;
void show() {
printf("%s\n",hello);
}
Bus error: 10
//正常であれば
hello