删除C中动态数组的元素

时间:2016-09-08 15:22:39

标签: c arrays

我有一个动态的整数数组:

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

如何在不创建新阵列和复制元素的情况下有效删除555-565之间的元素?

2 个答案:

答案 0 :(得分:2)

这可以算作删除吗?

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

int main(void) {
int* array = malloc(sizeof(int)*110);

for(int i=0; i<100; i++) 
          array[i]=i;

for (int r=56; r<100; r++)
        array[r]=array[r+6];

//memset(array+94, 0, 5);
memset(array+94, 0, 5 * sizeof(int));

}

答案 1 :(得分:2)

您可以通过以下方式执行此操作

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

int main() 
{
    size_t N = 1000;
    int *a = malloc( N * sizeof( int ) );

    for ( size_t i = 0; i < N; ++i ) a[i] = i;

    size_t n1 = 555, n2 = 565;


    for ( size_t i = n1; i < n2 + 1; i++ ) printf( "%d ", a[i] );
    printf( "\n" );

    memmove( a + n1, a + n2, ( N - n2 ) * sizeof( int ) );

    int *tmp = realloc( a, ( N - n2 + n1 ) * sizeof( int ) );

    if ( tmp ) a = tmp;

    for ( size_t i = n1; i < n2 + 1; i++ ) printf( "%d ", a[i] );
    printf( "\n" );

    free( a );
}

程序输出

555 556 557 558 559 560 561 562 563 564 565 
565 566 567 568 569 570 571 572 573 574 565 

或者您可以通过支持数组中当前数量的实际元素来避免数组重新分配。