Посмотрите внимательно на этот цикл:
for (int i = 1; i < argc; i++) {
char ci = *argv[i];
int i = ci - '0';
ints[i - 1] = i;
printf("%d\n", ints[i - 1]);
}
Вы определяете i
как свою переменную управления цикла.Но затем вы определяете другую переменную с именем i
внутри цикла.Это затеняет i
, определенный в начале цикла.
Глядя на эти строки:
int i = ci - '0';
ints[i - 1] = i;
На первой итерации цикла вы читаете значение '3'
.Это хранится в новом i
.Тогда вторая строка становится такой:
ints[3 - 1] = 3;
Более поздние эффективные итерации делают это:
ints[5 - 1] = 5;
ints[6 - 1] = 6;
ints[9 - 1] = 9;
Таким образом, вы никогда не пишете в первые два элемента массива и пишете после концамассив 3 раза.Запись после конца массива, а также чтение неинициализированных элементов вызывает неопределенное поведение .
Дайте внутреннему i
другое имя (например, value
).Это предотвращает маскирование внешнего i
.
for (int i = 1; i < argc; i++) {
char ci = *argv[i];
int value = ci - '0';
ints[i - 1] = value;
printf("%d\n", ints[i - 1]);
}