编写一个处理任何类型数组的函数

时间:2016-09-27 20:27:30

标签: c arrays linux

我在C中遇到了这个问题:

  

实施void arr_mix_x(void *arr, int n, size_t size);   功能。该功能将混合元素。它将通过以下方式实现:

     
      
  1. 将数组的下半部分放在数组的偶数索引中。
  2.   
  3. 将数组的较高一半放在数组的奇数索引中,反转。
  4.   
  5. 执行此操作后,将所有元素移动到循环中。
  6.   

我成功完成了问题的第一部分,这是相同的,但只处理int数组。但是,当我尝试运行它时,我编写的代码(或从问题的第一部分改写)给我一个分段错误。这是代码:

void arr_mix_x(void *arr, int n, size_t size)
{
    int i, j;
    void *tmpArr = malloc(size);
    void *tmp = NULL;

    memcpy(tmpArr, arr, size);

    for (i = 0, j = n-1; i < n/2; i++, j--)
    {
        memcpy(arr+(i*2), tmpArr+i, size/n);
        memcpy(arr+((i*2)+1), tmpArr+j, size/n);
    }

    memcpy(tmp, arr, size/n);

    for (i = 0; i < n-1; i++)
    {
        memcpy(arr+i, arr+i+1, size/n);
    }

    memcpy(arr+n-1, tmp, size/n);

    free(tmpArr);
    tmpArr = NULL;
}

这是数组和对函数的调用:

int arr[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };

arr_mix_x(arr, 10, sizeof(int) * 10);

1 个答案:

答案 0 :(得分:0)

好的,所以我显然在代码本身有一些错误。我改变了它现在正在工作。这是代码,如果它可以帮助任何人有类似的问题:

void arr_mix_x(void *arr, int n, size_t size)
{
    int i, j;
    void *tmpArr = malloc(size * n);
    void *tmp = malloc(size);

    memcpy(tmpArr, arr, size * n);

    for (i = 0, j = n-1; i < n/2; i++, j--)
    {
        memcpy(arr+(i*2*size), tmpArr+(i*size), size);
        memcpy(arr+((i*2+1)*size), tmpArr+(j*size), size);
    }

    memcpy(tmp, arr, size);

    for (i = 0; i < n-1; i++)
    {
        memcpy(arr+(i*size), arr+((i+1)*size), size);
    }

    memcpy(arr+((n-1)*size), tmp, size);

    free(tmpArr);
    tmpArr = NULL;

    free(tmp);
    tmp = NULL;
}

函数调用:

arr_mix_x(arr, 10, sizeof(int));