2016-04-26 1 views
4

Мне был задан этот вопрос в одном из моих отзывов для выпускного экзамена. Я немного в тупике. (Это компилируется в замазку в среде 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 байтов?

Заранее спасибо

+1

Мне кажется, что это плохой экзамен, потому что это не то, что когда-либо нужно делать. В основном у вас конфликтующие глобальные определения с тем же именем. Я лично хотел бы ошибку для этого, но на практике, я думаю, что инициализированное определение будет иметь приоритет, в результате чего размер будет равен 4 (предполагая 4-байтовые целые числа). –

+0

Ahh. Есть ли какие-либо ссылки, которые вы можете отправить мне для получения источников для ответа? Я думаю, вы правы. –

+2

_'ld: warning: предварительное определение '_secret' с размером 16 из '...' заменяется реальным определением меньшего размера 4 из '...' '_ – Oka

ответ

1

Они противоречат друг другу определения, так что не будет связывать так память не резервируется для негласного, или что-нибудь еще.

 Смежные вопросы

  • Нет связанных вопросов^_^