使用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 直接输入文本而不是文本的屏幕截图。
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 直接输入文本而不是文本的屏幕截图。