【问题标题】:using realloc() to change the malloc() size outputs garbage value (C language)使用 realloc() 改变 malloc() 大小输出垃圾值(C语言)
【发布时间】:2020-03-20 17:48:31
【问题描述】:

程序做什么:

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

SCREENSHOT AND EXAMPLE OF THE PROGRAM

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

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

问题

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

但是,这样做会破坏程序。 SCREENSHOT OF THE NEW OUTPUT OF THE 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();
}

【问题讨论】:

  • 为什么要发文字截图?只需发布文本。
  • 我可以看到至少 一个 特定输入会导致未定义行为的地方。您也有使用未初始化和不确定值的地方。
  • 至于帮助您解决问题:请学习如何使用调试器逐语句逐句执行您的代码。如果您对编程非常认真,那么能够使用调试器是一项至关重要的技能。
  • @KamilCuk 抱歉,下次我一定会这样做!谢谢!
  • 您可以使用问题下方的edit 按钮将图片链接替换为相关文字。

标签: c realloc calloc


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不太确定 bzero 的工作原理,但我一定会尝试一下!谢谢!此外,我对截图感到非常抱歉!我在这里很新,所以我不知道事情是如何运作的,所以谢谢你指出这一点!下次一定直接发文!
  • 你好!谢谢!!终于成功了!!通过 Google 搜索“Bzero in C”让我遇到了 memset()! memset() 在 C 中基本上是 bzero !!我在我的程序中输入了以下新代码行! memset(count, 0, highestValue*sizeof(count[0]));
  • @KarlJohn memset() 函数优于 bzero() 函数,因为 memset() 是标准 C 库的一部分,而 bzero() 是已弃用的 Linux 函数。请参阅stackoverflow.com/questions/17096990/why-use-bzero-over-memset 中的讨论
  • 你好@RichardChambers!谢谢!我已经使用了 memset() 函数并且我的程序已经成功运行了!非常感谢您的帮助!
  • @RichardChambers 没错,memset 比 bzero 更受欢迎。我在帖子中对其进行了编辑。 (我倾向于说bzero,因为它完全不言自明,就像我会说gets,即使它非常不安全,因此我在实践中不使用它。但我承认它可能会让初学者感到困惑,所以我编辑了这个使用 memset 发布!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多