使用 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
元素,其中 n
是 oldSize - 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
假设我有一个动态分配的数组:
int * arr = (int *) malloc(sizeof(int) * oldSize);
for(int i = 0; i < oldSize; i++){
arr[i] = i;
}
我想将该内存段缩小到 newSize
大小,以便 arr
仅包含:
{oldSize - newSize, ... oldSize - 1}
是否可以不遍历数组中的每个元素(除了第一个 n
元素,其中 n
是 oldSize - 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