Обмен значениями неопределенного размера с memcpy - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь поменять значение двух элементов в массиве, где я знаю их размер как переменную, мой код выглядит так:

void function(void *array, size_t size) {
    /*in this example the array's members are 2
    and i want to swap them*/
    void *help = malloc(size);

    memcpy(help, &array[0], size);
    memcpy(&array[0], &array[1], size);
    memcpy(&array[1], help, size);
    free(help);
}

Я что-то упустил?

1 Ответ

2 голосов
/ 01 апреля 2020

Тип void является неполным типом. Таким образом, вы не можете разыменовывать указатель типа void *.

. Напишите функцию наподобие

void function(void *array, size_t size) {
    /*in this example the array's members are 2
    and i want to swap them*/
    void *help = malloc(size);

    memcpy(help, array, size);
    memcpy( array, ( char * )array + size, size);
    memcpy( ( char * )array + size, help, size);
    free(help);
}

Вот демонстрационная программа.

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

void function(void *array, size_t size) {
    /*in this example the array's members are 2
    and i want to swap them*/
    void *help = malloc(size);

    memcpy(help, array, size);
    memcpy( array, ( char * )array + size, size);
    memcpy( ( char * )array + size, help, size);
    free(help);
}

int main(void) 
{
    int a[] = { 1, 2 };
    const size_t N = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
    putchar( '\n' );

    function( a, sizeof( int ) );

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
    putchar( '\n' );

    return 0;
}

Ее вывод

1012 *
...