使用realloc()改变malloc()大小输出垃圾值(C语言)

using realloc() to change the malloc() size outputs garbage value (C language)

WHAT THE PROGRAM DO:

我正在制作一个程序,显示用户输入数字的次数。如果输入的数字小于 1,它将停止询问值。

SCREENSHOT AND EXAMPLE OF THE PROGRAM

我能够通过将数组 "count" 的值初始化为 100 来创建程序。 SCREENSHOT OF WHAT I DID。

这个程序的问题是,它只接受 100 以内的值。它不会接受超过 100 的值。如果输入的值超过 100,这是一个屏幕截图:SCREENSHOT OF MORE THAN 100

THE PROBLEM

这就是我希望使用 realloc() 的地方。我希望根据输入的最高值更改 malloc() 大小,以便使用 realloc() 时更加灵活。 SCREENSHOT OF WHAT I CHANGED IN THE PROGRAM TO USE REALLOC()

但是,这样做会破坏程序。 SCREENSHOT OF THE NEW OUTPUT OF THE PROGRAM

请帮助我。

MY PROGRAM

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <stdbool.h>

main()
{
    //DECLARATION OF VARIABLES
    int i, j, k, highestValue=1, size=1;
    int* input = (int*)calloc(size, sizeof(int));
    int* count = (int*)calloc(highestValue, sizeof(int));

    bool iCondition = true;

    //USER INPUT
    for (i=0; iCondition==true; i++)
    {
        //GETS USER INPUT
        printf("Enter a number: ");
        scanf("%d", &input[i]);

        //CHECKS IF THE NUMBER ENTERED IS A HIGH NUMBER 
        if (highestValue<input[i]){
            highestValue = input[i];
            count = realloc(count, highestValue * sizeof(int));
        }


        //CHECKS HOW MANY TIMES THE NUMBER HAS BEEN ENTERED
        bool jCondition = true;
        for(j=0; jCondition==true; j++)
        {       
            if (input[i] == j){
                count[j-1]++;
                jCondition=false;
            }       
        }

        //ENDS THE LOOP IF THE ENTERED NUMBER IS LESS THAN 1
        if(input[i] < 1)
            iCondition = false;

        //IF NOT, THIS WILL REALLOCATE/CHANGE ARRAY SIZE BY ADDING +1!!
        else{
            size++;
            input = realloc(input, size * sizeof(int));
        }
    }

    //PRINTS OUTPUT | USES THE HIGHESTVALUE AS THE CONDITIONAL EXPRESSION FOR FLEXIBILITY
    for (i=0; i<=highestValue; i++)
    {   
        //PRINTS ALL NUMBER THAT IS NOT EQUAL TO ZERO(0)
        if (count[i] != 0)
            printf("\n %d was entered %d time/s ", i+1, count[i]);
    }   
    getch();
}

当你使用realloc时,旧数组末尾之后的元素被初始化。因此,您的价值可以是任何人,包括垃圾。

在使用新创建的元素之前,您应该使用标准方法初始化它们(使用循环,使用 memset)...

编辑:因为你只用 realloc 分配了 一个 额外的元素,你可以直接用 input[size-1] = '[=12=]' 初始化它。请注意,realloc 具有不小的开销,因此它通常用于在实际用例中一次分配多个元素。

此外,正如@KamikCuk 所提到的,您应该post 直接输入文本而不是文本的屏幕截图。