Программа на 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 ответа

Решение

Есть несколько проблем с вашим кодом:

  1. Вы должны двигаться inputArray = (int *)malloc(N * sizeof(int)); в блок if, чтобы вы выделяли память только при входе в блок (и N гарантированно будет между 1 и 100). Также нет необходимости разыгрывать malloc() как (int *),

  2. Ваш второй цикл for имеет точку с запятой в конце: for (counter = 0; counter < N; counter++);, Если вы оставите его там, цикл for будет увеличиваться counter до тех пор counter == N, а потом printf("%d\n", inputArray[counter]); будет вызван впоследствии, но только один раз и с неправильным индексом (так как counter == Nчто бы вывести тебя за пределы).

  3. Вы забыли free(inputArray) после того, как вы закончите, используя его. Вы можете сделать это сразу после dW = 0;,

Ваша проблема в этой строке:

for (counter = 0; counter < N; counter++);

Видите эту точку с запятой? Это по существу заставляет эту строку делать то же самое, что и:

for (counter = 0; counter < N; counter++) { /* do nothing */ }

Ваш printf затем блок запускается, но только один раз, а счетчик равен NТаким образом, вы читаете все случайные данные в памяти непосредственно после окончания inputArray в кучу.

Решение: избавьтесь от этой точки с запятой.

Другие вопросы по тегам