Мне был задан этот вопрос в одном из моих отзывов для выпускного экзамена. Я немного в тупике. (Это компилируется в замазку в среде Linux)Предположим, что foo.c содержит глобальное определение int secret = 4;
Вопрос: Пусть
foo.c
содержит глобальное определениеint secret = 4;
иbar.c
содержит глобальное определениеchar secret[16];
Что произойдет, когдаfoo.c
иbar.c
связаны друг с другом? Сколько памяти будет зарезервировано дляsecret
?
Моей попытка: Я думаю, что, поскольку они являются глобальными определениями того же имя, что они оба сильных переменных и не компилируются (т.е. ошибки линкера), потому что вы не можете иметь несколько сильные переменные. Там, где я запутался, сколько памяти будет зарезервировано для secret
. Возможно, это тривиально, было бы (16 байт, поскольку char 1 байт) + 4 байта для целого числа, в результате чего получается всего 20 байтов?
Заранее спасибо
Мне кажется, что это плохой экзамен, потому что это не то, что когда-либо нужно делать. В основном у вас конфликтующие глобальные определения с тем же именем. Я лично хотел бы ошибку для этого, но на практике, я думаю, что инициализированное определение будет иметь приоритет, в результате чего размер будет равен 4 (предполагая 4-байтовые целые числа). –
Ahh. Есть ли какие-либо ссылки, которые вы можете отправить мне для получения источников для ответа? Я думаю, вы правы. –
_'ld: warning: предварительное определение '_secret' с размером 16 из '...' заменяется реальным определением меньшего размера 4 из '...' '_ – Oka