В GCC, если переменная объявлена с атрибутом weak и во время (статической) компоновки определение не найдено, переменная будет иметь адрес ноль, т. е. если указатель инициализируется адресом переменной, указатель будет 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)
Вопрос в следующем: хотя поведение ожидаемо, ни в одном документе об этом не упоминается. Может ли кто-нибудь указать мне на какой-либо материал, объясняющий такое поведение? Спасибо!