Похоже, что программа обращается к одной и той же ячейке памяти для каждого объявленного вами массива int tab[n]
, но, как уже упоминалось, она не должна работать.
Но я думаю, что здесь происходит что-то вроде: вы размещаете tab [] внутри main (), скажем, по адресу 0x00000001 (возьмем это только в качестве примера). Массив имеет n целых чисел, но не имеет значений вообще.
Затем вы заходите в myInput (), снова объявляете массив (того же размера), в другом адресе, например 0x001F0000, и затем устанавливаете значения одно за другим.
Итак, когда функция завершается, она освобождает выделенную память от своих переменных, поэтому ваш массив больше не существует.
Но подождите, это C, поэтому, когда вы освобождаете память, вы только сообщаете куче (или распределителю памяти, в общем), что адреса могут использоваться снова. Вы НЕ точно удаляете значения из памяти.
Затем вы вызываете myDisp () и снова объявляете ваш массив. Похоже, что память, которую вы только что запросили, имеет более высокий приоритет, а затем она снова отдается вашей программе. Таким образом, ваш массив снова создается и по тому же адресу.
Таким образом, даже если вы не заполнили его значениями, память читается (как это всегда допустимо в C), и значения все еще там.
О, а массив объявлен внутри main ()? С этим ничего не происходит. Попробуйте напечатать его значения, и я уверен, что у вас не будет правильных значений.
Это мое предположение.
РЕДАКТИРОВАТЬ: просто чтобы увидеть, что происходит: попробуйте объявить другой массив после табуляции (не переименовывать табуляцию), скажем, tab2, той же длины, и используйте его, чтобы поместить ваши значения вместо табуляции, затем позвольте программе снова работать :)