Программа на C для нахождения большинства элементов массива с использованием определенного пользователем размера массива возвращает неожиданные результаты
Я пытаюсь написать программу переменного тока, которая предлагает пользователю ввести размер массива (N) от 1 до 100. Затем предложить пользователю ввести элементы массива до размера N. После этого я хочу отобразить вышеупомянутые элементы в пользователь, однако, во время выполнения случайных, или, как кажется, случайные числа отображаются. Я не уверен, если это связано с использованием malloc для определенного пользователем размера массива или что. Если у вас есть понимание того, в чем может быть проблема, я был бы очень признателен.
Программа:
int main()
{
int N;
int dW;
int *inputArray;
int counter;
do {
// Prompts user to input array size up to 100
printf("\nEnter the value of N up to 100: \n");
scanf("%d", &N);
// Uses pointer "inputArray" to pacify compiler and allocates size of N in memory for array
inputArray = (int *)malloc(N * sizeof(int));
// Checks if temp is greater than 1 and less than 100, if yes prompts user to reenter N
if (N >= 1 & N <= 100)
{
// Prompts user to input array numbers to the size of N
for (counter = 0; counter < N; counter++)
{
printf("\nEnter the element %d: \n", counter);
scanf("%d", &inputArray[counter]);
}
// displays numbers provided by user
for (counter = 0; counter < N; counter++);
{
printf("%d\n", inputArray[counter]);
}
dW = 0;
}
else
{
printf("\nIllegal Entry, enter a value between 1 and 100\n");
dW = 1;
}
} while (dW >= 1);
return 0;
}
Выход:
Введите значение N до 100: 5
Введите элемент 0: 1
Введите элемент 1: 2
Введите элемент 2: 3
Введите элемент 3: 4
Введите элемент 4: 5
00200000
2 ответа
Есть несколько проблем с вашим кодом:
Вы должны двигаться
inputArray = (int *)malloc(N * sizeof(int));
в блок if, чтобы вы выделяли память только при входе в блок (иN
гарантированно будет между 1 и 100). Также нет необходимости разыгрыватьmalloc()
как(int *)
,Ваш второй цикл for имеет точку с запятой в конце:
for (counter = 0; counter < N; counter++);
, Если вы оставите его там, цикл for будет увеличиватьсяcounter
до тех порcounter == N
, а потомprintf("%d\n", inputArray[counter]);
будет вызван впоследствии, но только один раз и с неправильным индексом (так какcounter == N
что бы вывести тебя за пределы).Вы забыли
free(inputArray)
после того, как вы закончите, используя его. Вы можете сделать это сразу послеdW = 0;
,
Ваша проблема в этой строке:
for (counter = 0; counter < N; counter++);
Видите эту точку с запятой? Это по существу заставляет эту строку делать то же самое, что и:
for (counter = 0; counter < N; counter++) { /* do nothing */ }
Ваш printf
затем блок запускается, но только один раз, а счетчик равен N
Таким образом, вы читаете все случайные данные в памяти непосредственно после окончания inputArray
в кучу.
Решение: избавьтесь от этой точки с запятой.