C语言 如何复制元素从一个数组到其他元素的数组使用指针?

dxpyg8gm  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(132)

我试图将一个动态分配数组(addVec)的元素复制到内存中的另一个(array)中,在此之前,将指向该数组的指针从main传递到一个函数(changeArray),该函数将值分配给addVec
到目前为止,我的做法是:
1.在main中动态分配数组(array
1.在changeArray()中动态分配另一个数组(addVec
1.传递这个动态分配数组的指针,并在changeArray中接收它。
但是,我不确定如何正确执行步骤3和4,即将addVec的元素复制到array中。

void changeArray(double** vec1)
{
    double* addVec = (double*)calloc(SIZE, sizeof(double));
    double num = 1.0;
    for (int i = 0; i < SIZE; ++i)
    {
        *(addVec + i) = num;
        num = num + 1;
    }

    printf("Printing out addVec: \n");
    for (int i = 0; i < SIZE; ++i)
    {
        printf("%.1f ", *(addVec + i));
    }

    printf("\nNow we want to copy elements from addVec to vec1.\n");
    // Step 4
    for (int i = 0; i < SIZE; ++i)
    {
        **(vec1 + i) = *(addVec + i);
    }

    free(addVec);
}

int main()
{
    double* array = (double*)malloc(SIZE * sizeof(double));
    double num = 11.0;
    for (int i = 0; i < SIZE; ++i)
    {
        *(array + i) = num;
        num = num + 1;
    }
    printf("The address of array is: %x \n", array);

    changeArray(&array);

    printf("The array is now: 1, 2, 3... \n");
    for (int i = 0; i < SIZE; ++i)
    {
        printf("%.1f ", *(array + i));
    }

    free(array);

    return 0;
}
hivapdat

hivapdat1#

函数changeArray声明如下

void changeArray(double** vec1)

这说不通例如,指针array通过指向它的指针引用传递给函数

changeArray(&array);

但是传递的指针在函数内不改变。函数声明是没有意义的。您可以至少像这样声明该函数

void changeArray(double *vec1)

就像

changeArray(array);

要改变由指针array指向的数组的元素,动态地再分配一个数组没有任何意义。
然而,在任何情况下,函数在这个for循环中有一个bug

for (int i = 0; i < SIZE; ++i)
{
    **(vec1 + i) = *(addVec + i);
}

相反你需要写

for (int i = 0; i < SIZE; ++i)
{
    *(*vec1 + i) = *(addVec + i);
}

也就是说,首先需要解引用指针vec1以访问原始指针array,然后应用指针算术,方法与赋值语句右侧相同。
如果你想动态地创建一个新的数组,并用新动态分配的数组的地址重新分配传递的指针,那么函数可以看起来像这样

int changeArray( double **vec1 )
{
    double *addVec = calloc( SIZE, sizeof( double ) );
    int success = addVec != NULL;

    if ( success )
    {
        free( *vec1 );

        double num = 1.0;
        for ( int i = 0; i < SIZE; ++i )
        {
            *( addVec + i ) = num;
            ++num;
        }

        printf("Printing out addVec: \n");
        for ( int i = 0; i < SIZE; ++i )
        {
            printf( "%.1f ", *( addVec + i ) );
        }

        printf("\nNow we want to copy elements from addVec to vec1.\n");

        *vec1 = addVec;
    }

    return success;
}

在这种情况下,它被称为changeArray( &array )

相关问题