GCC では、変数がweak属性で宣言され、(静的) リンク時に定義が見つからない場合、変数のアドレスは0になります。つまり、ポインターが変数のアドレスで初期化される場合、ポインターは次のコード スニペットが示すように、NULLである必要があります。
foobar.c :
extern int foo __attribute__((weak));
extern int bar;
int *a[] = {&foo, &bar};
main.c :
#include <diag/Trace.h>
//int foo;
int bar;
extern int *a[];
int main(void) {
trace_printf("%p, %p", a[0], a[1]);
return 0;
}
出力は次のとおりです: 0, 0x20000120 (私は arm-none-eabi-gcc 5.4.1 を使用しています)
問題は、この動作は予期されたものであるにもかかわらず、それについて言及されたドキュメントがないということです。この動作を説明する資料を誰かに教えてもらえますか? ありがとう!