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

使用realloc()更改malloc()大小输出垃圾值(C语言),c,realloc,calloc,C,Realloc,Calloc,该计划的作用: 我正在制作一个程序,显示用户输入数字的次数。如果输入的数字小于1,它将停止询问值 我可以通过将数组“count”的值初始化为100来创建程序。 . 这个程序的问题是,它只接受100之前的值。它将不接受超过100的值。如果输入的值超过100,则这是一个屏幕截图: 问题 这就是我想要realloc()进入的地方。我希望根据输入的最高值更改malloc()大小,以便使用realloc()时更加灵活 但是,这样做会破坏程序 请帮帮我 我的节目 #包括 #包括 #包括 #包括 main

该计划的作用:

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

我可以通过将数组“count”的值初始化为100来创建程序。 .

这个程序的问题是,它只接受100之前的值。它将不接受超过100的值。如果输入的值超过100,则这是一个屏幕截图:

问题

这就是我想要realloc()进入的地方。我希望根据输入的最高值更改malloc()大小,以便使用realloc()时更加灵活

但是,这样做会破坏程序

请帮帮我

我的节目

#包括
#包括
#包括
#包括
main()
{
//变量声明
int i,j,k,最大值=1,大小=1;
int*input=(int*)calloc(size,sizeof(int));
int*count=(int*)calloc(最高值,sizeof(int));
布尔条件=真;
//用户输入
对于(i=0;i条件==true;i++)
{
//获取用户输入
printf(“输入一个数字:”);
scanf(“%d”,&input[i]);
//检查输入的数字是否为高位数字

当您使用
realloc
时,如果(highestValue,则旧数组结束后的元素被单位化。因此,您的值可以是任何人,包括垃圾

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

编辑:由于使用realloc只分配一个额外元素,因此可以直接使用
input[size-1]='\0'
对其进行初始化。请注意,realloc的开销非常大,因此通常用于在实际用例中一次分配多个元素


此外,正如@KamikCuk所提到的,你应该直接发布文本,而不是文本截图。

为什么要发布文本截图?只需发布文本。我至少可以看到一个地方,在那里特定的输入可能导致未定义的行为。你也可以使用未初始化和不确定的值。至于帮助你解决问题:请学习如何使用调试器逐条检查代码语句。如果您对编程近乎认真,则能够使用调试器是一项至关重要的技能。@KamilCuk抱歉,我下次一定会这么做!谢谢!您可以使用问题下方的
编辑
按钮,用r替换指向图片的链接高兴的文字。我不太清楚bzero的工作原理,但我一定会尝试一下!谢谢!而且,我对截图感到非常抱歉!我是新来的,所以我不知道如何工作,所以谢谢你指出这一点!我下次一定会直接发短信!你好!谢谢!!终于成功了!!在C中搜索“bzero”通过谷歌让我遇到了memset()!memset()基本上是C语言中的bzero!!我在我的程序中输入了以下新代码行!
memset(count,0,highestValue*sizeof(count[0]);
@KarlJohn
memset()
函数优于
bzero()
函数,因为
memset()
是标准C库的一部分,
bzero()
是一个已被弃用的Linux函数。请参阅Hello@RichardChambers!谢谢!我使用了memset()中的讨论函数和我的程序成功运行!非常感谢您的帮助!!@RichardChambers没错,
memset
比bzero更受欢迎。我在帖子中编辑了它。(我倾向于说
bzero
,因为它完全是不言自明的,就像我会说
get
一样,即使它非常不安全,所以我不会在实践中使用它。但我承认它会让初学者感到困惑,所以我用memset编辑了这篇文章!)
#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();
}