2015-12-03 7 views
1

Мой код выглядит следующим образом:Итерация через массив

void main() 
{ 
    int vect[10], i; 

    for (i=0; i<5; i++) 
     vect[i] = i*2; 

    printf("Vector: "); 

    for (i=0; i<10; i++) 
     printf("%d ", vect[i]); 

    printf("\n"); 

При выполнении, он всегда будет показывать мне этот вид продукции: enter image description here

Чтобы сделать это просто показать элементы, которые я ввели (первые пять; 0 2 4 6 8) Я должен использовать счетчик или есть способ сказать ему только показать мне эти элементы?

Есть ли причина, по которой элементы 5, 6, 7 и 9 всегда одинаковы, но 8-й изменяется каждый раз? Я переписал программу, чтобы изменить, как она показывает элементы, и она аналогична: она показывает пять элементов, которые я ввел, а затем три, которые остаются всегда постоянными, а затем каждый, который изменяется каждый раз, когда программа выполняется, а затем последняя константа. Почему это?

+0

Вы * do * знаете, что 'int vect [10]' неинициализирован? Вы устанавливаете первые 5 элементов, а следующие 5 элементов по-прежнему имеют неопределенные значения. Вы не можете делать никаких выводов или объяснений для этих 5 других элементов. –

+3

Вы можете использовать 'int vect [10] = {0}' для инициализации вектора ко всем нулям. –

+0

Так что я не могу установить вектор из X элементов без инициализации их всех? Если я хочу создать вектор, и они будут добавлять к нему элементы, итерации только через те, которые я инициализировал, следует ли использовать список? @WeatherVane – Xayide

ответ

8

int vect[10] индексы 5-9 не инициализированы - вам нужно назначить им что-то, иначе они (вероятно) вернут мусор, так как это неопределенное поведение (C99 standard, section 5.1.2 "Execution environments"). Вы можете также определить vect, как статические, т.е. static int vect[10], так как статические переменные будут автоматически инициализируется в 0, и статический целочисленный массив будет иметь все элементы автоматически инициализированы 0.

+0

Привет, этот отличный ответ помог мне решить очень сложную проблему, с которой я столкнулся. –

2

В коде vect автоматический локальный массив, не инициализируется явно при определении. Итак, в этот момент все значения элементов являются неопределенными.

Цитирую C11, глава §6.7.9

Если объект, который имеет автоматическую продолжительность хранения не инициализирована явно, его значение неопределенными. [...]

В первый цикл for, вы инициализируете только 5 элементов, остальные элементы не инициализируются и содержат неопределенные значения.

Попытка считывания неопределенных значений вызывает undefined behavior.

Связанные, приложение J, тот же стандарт, для неопределенного поведения

Значение объекта с автоматической продолжительностью хранения используются во время его неопределенных.

Как только ваша программа будет показывать UB, ничего не гарантируется.

FWIW, void main() должно по крайней мере быть int main(void).

Смежные вопросы