当我运行程序时,打印的第二个和第三个值是垃圾值,我不知道为什么。我认为这应该是我输入的数字。
代码:
int main()
{
int a = 0, b = 0;
int * students = NULL;
int * size = &a;
int * studentscount = &b;
func1(students, size, studentscount);
return 0;
}
#include "Source.h"
int checkAllocation(void * ptr)
{
if (ptr == NULL)
return 1;
return 0;
}
int * doubleArr(int *arr, int size)
{
int * newArr = (int*)malloc(size * sizeof(int));
checkAllocation(newArr);
for (int i = 0; i < size; i++)
newArr[i] = arr[i];
size *= 2;
newArr = (int*)realloc(newArr, size);
checkAllocation(newArr);
free(arr);
return (newArr);
}
void func1(int *students, int *size, int *studentscount)
{
int num;
students = (int *)malloc(sizeof(int) * 2);
checkAllocation(students);
*(studentscount) = 0;
*(size) = 2;
printf("Enter students, to end enter a negative number.\n");
do
{
printf("Enter student number %d: ", *(studentscount)+1);
scanf("%d", &num);
if (num >= 0)
{
*(students + *(studentscount)) = num;
*(studentscount) += 1;
}
if (*(studentscount) == (*size))
{
students = doubleArr(students, *(size));
*(size) *= 2;
}
} while (num >= 0);
printf("******************\nArray size: %d\nNumber of students: %d\n******************\n", *(size), *(studentscount));
for (int i = 0; i < *(studentscount); i++)
printf("student #%d: %d\n", i + 1, *(students + i));
free(students);
}
有什么建议让代码打印我输入的值而不是垃圾值吗?
答案 0 :(得分:1)
您可能应该处理一些问题,但垃圾的原因很可能是语句realloc(newArr, size)
,它只考虑计数而不考虑数据类型int
的大小。因此,不是将数组大小加倍,而是实际减少它;因此,realloc
可能会返回一个不同的内存块,其中只有前一个部分被接管;或者你写的内存的某些部分已经无效。无论如何,你很有可能在这里放弃输入的值。所以 - 正如bluepixy所指出的,声明realloc(newArr, size*sizeof(int))
应该解决主要问题。
进一步注意,当在不同的地方分配内存时,语句realloc
接管前一个内存块的内容,并且(在这种情况下)释放前一个块(参见cppreference of realloc
)。因此,无需手动传输数据,尤其不需要先malloc
然后realloc
,因此最后不需要单独的free
。因此doubleArr
的代码实际上可能如下所示。
int * doubleArr(int *arr, int size) {
return realloc(arr,size*2*sizeof(int));
}