如何使用realloc函数在C语言中增加和减少数组?

问题描述 投票:-1回答:1

您好,我编写了一个函数,该函数从用户那里收到一组评分,它应该询问用户新的数组大小,这将增加数组并允许用户添加器官或减少数组并删除器官。但是相反,它仅在本地更改数组并打印。我怎样才能让她返回阵列并取消不必要的打印?谢谢!功能:

    void changeNumber(int *grades, int size)
    {

    int newSize = 0;
    int* newGrades = 0;
    int i = 0;

    printf("Enter new number of grades: ");
    scanf_s("%d", &newSize);

    if (newSize > size)
    {
        grades = (int*)realloc(grades, newSize * sizeof(int));
        for (i = size; i <= (newSize-1); i++)
        {
            printf("Enter grade %d: ", i+1);
            scanf_s("%d", grades+i);
            grades[i] = checkNumber(grades[i]); 
        }
        for (i = 0; i < newSize; i++)
        {
            printf("%d ", grades[i]);
        }
    }
    else if (newSize < size)
    {
        newGrades = (int*)malloc(newSize * sizeof(int));
        for (i = 0; i < (newSize-1); i++)
        {
            grades[i] = grades[i];
        }
        for (i = 0; i < newSize; i++)
        {
            printf("%d ", grades[i]);
        }
    }
    free(newGrades);
c arrays heap realloc
1个回答
0
投票

如果函数返回类型为void,则必须通过引用将指针传递给函数

void changeNumber(int **grades, int size);

否则该函数将处理原始参数的副本,并且副本的更改不会影响原始参数。

但是当函数设置新的数组大小时,函数的用户应该知道什么是数组的新大小。因此,例如,您应该从函数中返回数组的新大小。

int changeNumber(int **grades, int size);

此外,如果新分配的数组的大小小于当前大小,则无需将元素复制到其自身

    newGrades = (int*)malloc(newSize * sizeof(int));
    for (i = 0; i < (newSize-1); i++)
    {
        grades[i] = grades[i];
    }

并且您必须将新指针分配给指向数组第一个元素的旧指针。

代替用于数组大小的int类型,最好使用无符号整数类型size_t

该函数可以通过以下方式查看

size_t changeNumber( int **grades, size_t size )
{
    size_t newSize = 0;

    printf( "Enter new number of grades: " );

    if ( scanf( "%zu", &newSize ) == 1 && size != newSize )
    {
        int *newGrades = realloc( *grades, newSize * sizeof( int ) );

        if ( newGrades != NULL )
        {
            if ( size < newSize )
            {
                for ( size_t i = size; i < newSize; i++ )
                {
                    printf( "Enter grade %zu: ", i + 1 );
                    scanf("%d", newGrades + i );
                    newGrades[i] = checkNumber( newGrades[i] ); 
                }
            }

            size = newSize;
            *grades = newGrades; 
        }

    }


    for ( size_t i = 0; i < size; i++ )
    {
        printf( "%d ", ( *grades )[i] );
    }
    putchar( '\n' );

    return size;   
}
© www.soinside.com 2019 - 2024. All rights reserved.