Объявленные объекты статической длительности (те, которые объявлены вне функции или с квалификатором static
), у которых нет указанного инициализатора, инициализируются тем значением, которое будет представлено буквальным нулем [т.е. целое число ноль, ноль с плавающей точкой или нулевой указатель, в зависимости от ситуации, или структура или объединение, содержащее такие значения]. Если объявление какого-либо объекта (включая объекты с автоматической продолжительностью) включает инициализатор, части, значения которых указаны этим инициализатором, будут установлены так, как указано, а остаток будет обнулен как со статическими объектами.
Для автоматических объектов без инициализаторов ситуация несколько более неоднозначна. Учитывая что-то вроде:
#include <string.h>
unsigned char static1[5], static2[5];
void test(void)
{
unsigned char temp[5];
strcpy(temp, "Hey");
memcpy(static1, temp, 5);
memcpy(static2, temp, 5);
}
Стандарт ясно, что test
не будет вызывать неопределенное поведение, даже если он копирует части temp
, которые не были инициализированы. В тексте Стандарта, по крайней мере, начиная с C11, неясно, гарантируется ли что-либо о значениях static1[4]
и static2[4]
, особенно в том случае, если они могут иметь другие значения. В отчете о дефекте говорится, что Стандарт не был предназначен для того, чтобы запретить компилятору вести себя так, как если бы код был:
unsigned char static1[5]={1,1,1,1,1}, static2[5]={2,2,2,2,2};
void test(void)
{
unsigned char temp[4];
strcpy(temp, "Hey");
memcpy(static1, temp, 4);
memcpy(static2, temp, 4);
}
, который может оставить static1[4]
и static2[4]
с разными значениями. В стандарте ничего не говорится о том, должны ли качественные компиляторы, предназначенные для различных целей , вести себя в этой функции. Стандарт также не дает указаний относительно того, как должна быть написана функция, если намерение, если программист требует, чтобы static1[4]
и static2[4]
содержали одно и то же значение, но не имеет значения, что это за значение.