Что вызывает эти значения массива по умолчанию? - PullRequest
0 голосов
/ 27 апреля 2018

Я работал над книгой языка программирования Kernighan / Ritchie C (2-е издание), и в примере в главе 1.6 на стр. 22 я столкнулся с каким-то странным (по крайней мере для меня) поведением, основанным на допущенной мной ошибке .

Ошибка состояла в том, что я объявил int ndigit[10], но пропустил цикл for, который устанавливает все целые числа в массиве на ноль.

Странно то, что первые 8 значений в массиве работают правильно, по умолчанию 0, но последние два значения по умолчанию - -373429304 и 32766. Это привело к тому, что функция подсчета цифр в программе работала, как и предполагалось, кроме отсчеты 8 и 9 с

Я исправил свою ошибку и исправил ее, но мне все еще любопытно, почему первые 8 значений, равные 0, но последние два значения были совершенно разными?

1 Ответ

0 голосов
/ 27 апреля 2018

Я добавлю к комментарию Мартина Веронно хороший ответ,

Что происходит с объявленной неинициализированной переменной в C? Имеет ли оно значение? )

Предполагается, что вы работаете на ПК x86 / x64, если вы объявляете int ndigit[10] внутри функции и что она хранится в стеке. Стек является частью памяти, в которой хранятся все вызовы функций, выполненные вашей программой ранее, адреса возврата, параметры функций и локальные переменные (не выделяются динамически).

Когда функция возвращается, пространство освобождается путем добавления значения к указателю стека. Данные в оперативной памяти остаются там. Было несколько нулевых байтов от выполнения кода, прежде чем они не были связаны с вашей частью кода, которую вы отлаживали, и что-то не было обнулено, что вы наблюдали.

...