Во время компиляции большинство компиляторов, таких как компилятор 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 не устанавливает никаких требований, поэтому может случиться что угодно. Это очень серьезная ошибка, которая может вызвать множество трудно отслеживаемых ошибок и сбоев.
person
Ṃųỻịgǻňạcểơửṩ
schedule
04.04.2018