Присвоение структуры C - неправильные значения в целевой структуре

У меня есть структура c в заголовочном файле: -

typedef struct sample
{
char *member1;
char **member2;
long *member3;
unsigned int member4;
} example;

Я объявил переменную typedef по умолчанию в том же заголовочном файле: -

const example defaultValue;

Определение defaultValue находится в файле c: -

const example defaultValue = 
{
NULL,
NULL,
NULL,
99
};

Теперь в другом файле c, если я это сделаю,

example example1 = defaultValue;

всем членам присваивается NULL, как и ожидалось, но «unsigned int member4» присваивается значение 0 вместо 99. Это очень странно, потому что defaultValue.member4 равно 99. Может кто-нибудь объяснить это необычное поведение? Есть ли лучший способ выполнить инициализацию структуры по умолчанию?


person confused    schedule 23.01.2011    source источник
comment
Код, который вы разместили, даже не скомпилируется. Возможно, вы тогда еще что-то упустили.   -  person detunized    schedule 24.01.2011
comment
Убедитесь, что вторая константа правильно указана в другом файле. Если это не так, вы получите (вероятно) пример 1, который будет заполнен нулями.   -  person payne    schedule 24.01.2011
comment
Пожалуйста, отредактируйте свое сообщение, чтобы буквально скопировать код из ваших реальных исходных файлов. Как заметили несколько человек, код, который вы разместили, не может быть скомпилирован, не говоря уже о поведении, о котором вы сообщаете. Поэтому помочь вам невозможно, так как вместо этого нам пришлось бы угадывать, как может выглядеть ваш код.   -  person Martin v. Löwis    schedule 24.01.2011
comment
@martin .. извините за неправильный пост - быстрый пример. Отредактировано.   -  person confused    schedule 24.01.2011


Ответы (2)


Вы хотите, чтобы ваш заголовочный файл объявлял defaultValue следующим образом:

extern const example defaultValue;

так что вы не столкнетесь с проблемами с более чем одним определением объекта. Без спецификатора extern у вас будет каждая единица перевода (включая заголовок), определяющая экземпляр defaultValue, что приводит к неопределенному поведению.

Вы хотите, чтобы все они ссылались на тот файл в файле .c, который вы описываете в вопросе, что и сделает для вас спецификатор extern.

person Michael Burr    schedule 23.01.2011
comment
@ Майкл ... большое спасибо за быстрый ответ. Да, я пропустил экстерн. Теперь он работает нормально. Еще раз спасибо. - person confused; 24.01.2011

Ваш пример, кажется, содержит несколько ошибок (struct отсутствует его r, а определение поля структуры должно заканчиваться точкой с запятой вместо запятой).

Кроме того, если ваш defaultValue находится в другом исходном файле, вы должны объявить его как extern в своем заголовке.

person peoro    schedule 23.01.2011