使用 realloc() 从已分配段的开头删除数据?

Using realloc() to remove data from the beginning of an allocated segment?

假设我有一个动态分配的数组:

int * arr = (int *) malloc(sizeof(int) * oldSize);
for(int i = 0; i < oldSize; i++){
    arr[i] = i;
}

我想将该内存段缩小到 newSize 大小,以便 arr 仅包含:

{oldSize - newSize, ... oldSize - 1}

是否可以不遍历数组中的每个元素(除了第一个 n 元素,其中 noldSize - newSize)并将它们移回 n 位置之前调用 arr = realloc(arr, sizeof(int) * newSize)?

您需要将要保留的元素移到列表的开头。幸运的是,有一个函数,memmove:

memmove(arr, arr + (oldsize-newsize), newsize * sizeof(int));

您可以使用标准函数memmove将表达式oldSize - newSize开始的元素移动到数组的开头,然后调用函数realloc.

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
    size_t oldSize = 10;
    size_t newSize = 6;
    
    int * arr = malloc( sizeof(int) * oldSize );
    
    for ( int i = 0; ( size_t )i < oldSize; i++ )
    {
        arr[i] = i;
    }
    
    for ( int i = 0; ( size_t )i < oldSize; i++ )
    {
        printf( "%d ", arr[i] );
    }
        
    putchar( '\n' );

    memmove( arr, arr + ( oldSize - newSize ), newSize * sizeof( int ) );
    
    int *tmp = realloc( arr, newSize * sizeof( int ) );
    
    if ( tmp != NULL )
    {
        arr = tmp;
        
        for ( int i = 0; ( size_t )i < newSize; i++ )
        {
            printf( "%d ", arr[i] );
        }
        
        putchar( '\n' );
    }
    
    free( arr );
    
    return 0;
}

它的输出是

0 1 2 3 4 5 6 7 8 9 
4 5 6 7 8 9