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