Во время компиляции большинство компиляторов, таких как компилятор GNU, могут определить, где используются неинициализированные переменные. Однако вам может потребоваться установить флаги, такие как -Wall
для компилятора GNU.
Здесь значение переменной уже , хотя это может быть любое значение. А именно это «начальное» состояние переменной.
Следовательно, вы должны инициализировать переменную, чтобы избежать мусора.
Когда объявляется переменная x
, она уже выделяет раздел для памяти &x
, на который ссылается это имя переменной. Неинициализированные значения и переменные уже помещены в адрес памяти.
Предположим, вы инициализируете переменную v
типа int. Он назначен адресу памяти, который является &v
типа int *. Поэтому адрес &v
будет помещен в открытое неиспользуемое место в памяти.
Рассмотрим этот код внутри главной функции:
int x;
// A number of bytes (in this case, sizeof(int), usually 4 B) already allocated
// starting at a memory location &x.
printf("Value at address %p: %d", &x, x);
// Value at &x may be any int, which is unpredictable
При компиляции этого кода появляется это предупреждение, где SOME_DIRECTORY
- произвольный каталог:
SOME_DIRECTORY>gcc -Wall -g sampleprogram.c -o sampleprogram
sampleprogram.c: In function 'main':
sampleprogram.c:8:5: warning: 'x' is used uninitialized in this function [-Wuninitialized]
printf("Value at address %p: %d", &x, x);
Начальное значение памяти, как и схемы, непредсказуемо. Неважно, почему ваше значение является случайным мусором. Это также форма неопределенного поведения , что означает, что международный стандарт компиляторов C не устанавливает никаких требований, поэтому может произойти что угодно . Это очень плохая ошибка, которая может привести к множеству трудных для отслеживания ошибок и сбоев.