некоторая проблема с инициализировать массив с самими элементами - PullRequest
0 голосов
/ 24 января 2019

Словом, я инициализирую массив сам с собой. Вот так и печатаю:

int a[10] =
{
   a[0], a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]   
};
int i = 0;
for(i = 0; i <10; i++)
{
     printf("a[%d] = 0x%x  \r\n",i,a[i]);
}

И это показывает:

a[0] = 0x4300eb50  
a[1] = 0x7f10  
a[2] = 0x0  
a[3] = 0x0  
a[4] = 0x9c76b200  
a[5] = 0x55c1  
a[6] = 0x9c76b060  
a[7] = 0x55c1  
a[8] = 0x93785430  
a[9] = 0x7ffc 

Я не могу понять, как это работает. И почему я могу инициализировать массив с самим элементом?

1 Ответ

0 голосов
/ 24 января 2019

Переменные в C определяются в два этапа:

  1. Объявление и определение (выделение места компилятором)
  2. Инициализация (необязательно)

Простого int a[10] достаточно, чтобы объявить и определить переменную a как массив из десяти int элементов. Если объявлено локально внутри функции (как автоматическая переменная), тогда содержимое массива будет неопределенным и будет казаться случайным.

Когда вы используете сам массив при инициализации (который работает, потому что переменная была определена), вы инициализируете его неопределенными данными самого массива. Это равносильно тому, чтобы вообще не инициализировать массив.

Для целочисленных типов это обычно работает нормально, но если данные содержат значения с условиями ловушки (что может произойти для других типов), то их использование приводит к неопределенному поведению .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...