C - 为什么这个函数不能反转数组?

时间:2018-01-16 11:31:17

标签: c arrays reverse heap-memory

此函数应该反转堆上的向量数组,但它不起作用。似乎tmp_array也会改变。

输出是: 13.700000 21.300000 13.700000 21.300000

应该是: 8.900000 31.700000 13.700000 21.300000

createVector使用两个双值x和y创建一个struct Vector。

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

typedef struct _Vector_
{
    double x_;
    double y_;
} Vector;

Vector *createVector(double x, double y)
{
    Vector *vector = malloc((size_t)(sizeof(Vector)));
    if (vector == NULL)
    {
        printf("Memory Error!\n");
        return vector;
    }

    vector->x_ = x;
    vector->y_ = y;

    return vector;
}
void reverseVectorArray(Vector **vector_array, int length)
{
    Vector **tmp_array = malloc(sizeof(Vector*)*length);

    if(tmp_array == NULL)
    {
        printf("Memory Error!\n");
        return;
    }

    memcpy(tmp_array, vector_array, sizeof(Vector*)*length);

    int position = length - 1;
    for(int i = 0; i<length; i++)
    {
        *(vector_array[position]) = *(tmp_array[i]);
        position--;
    }

    free(tmp_array);
}

int main()
{
    int length = 2;
    Vector **vector_array = malloc(sizeof(Vector*) * 2);
    vector_array[0] = createVector(13.7, 21.3);
    vector_array[1] = createVector(8.9, 31.7);

    reverseVectorArray(vector_array, length);

    for(int i = 0; i<length; i++)
    {
        printf("%f ", vector_array[i]->x_);
        printf("%f ", vector_array[i]->y_);
        printf("\n");
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

看来你的意思如下。

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

typedef struct Vector
{
    double x;
    double y;
} Vector;

Vector * createVector( double x, double y )
{
    Vector *vector = malloc( sizeof( Vector ) );

    if ( vector )
    {
        vector->x = x;
        vector->y = y;
    }

    return vector;
}

void reverseVectorArray( Vector **vector_array, size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        Vector tmp = *vector_array[i];
        *vector_array[i] = *vector_array[n - i - 1];
        *vector_array[n - i - 1] = tmp;
    }
}

int main( void )
{
    size_t n = 2;

    Vector **vector_array = malloc( n * sizeof( Vector * ) );

    vector_array[0] = createVector( 13.7, 21.3 );
    vector_array[1] = createVector( 8.9, 31.7 );

    reverseVectorArray( vector_array, n );

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%f ", vector_array[i]->x );
        printf( "%f ", vector_array[i]->y );
        putchar( '\n' );
    }

    return 0;
}

考虑到您应该为程序附加一个代码,该代码将释放所有已分配的内存。

至于你的代码,那么对于根据C标准的启动器,没有参数的函数main应声明为

int main( void )

如果您使用的是memcpy功能,则需要添加标题<string.h>

而不是这个声明

Vector *vector = malloc((size_t)(sizeof(Vector*)));
                                        ^^^^^^^

你必须写

Vector *vector = malloc( sizeof( Vector ) );
                                 ^^^^^^

无需分配辅助数组来反转原始数组。这种方法效率低下。

函数reverseVectorArray的问题在于它使用数组前半部分的值重写数组后半部分的值。所以它使阵列的两半相等。