程序在奇怪的地方打印垃圾值(C)

时间:2017-04-22 20:49:46

标签: c

当我运行程序时,打印的第二个和第三个值是垃圾值,我不知道为什么。我认为这应该是我输入的数字。

The output

代码:

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);
}

有什么建议让代码打印我输入的值而不是垃圾值吗?

1 个答案:

答案 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));
}