我正在try 将一个动态分配的数组(addVec)的元素复制到内存中的另一个(array)中,在将指向该数组的指针从main传递到一个为addVec赋值的函数(changeArray)之后.

到目前为止,我的方法是:

  1. main中动态分配数组(array)
  2. changeArray()中动态分配另一个数组(addVec
  3. 传递这个动态分配的数组的指针,并在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;
}

推荐答案

函数changeArray声明如下

void changeArray(double** vec1)

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

changeArray(&array);

但传递的指针在函数内不会更改.函数声明是毫无意义的.您可以至少像这样声明该函数

void changeArray(double *vec1)

把它叫成

changeArray(array);

为了改变指针array所指向的数组的元素,没有任何意义动态地再分配一个array.

然而,在任何情况下,该函数在这个for循环中都有错误

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 ).

C++相关问答推荐

数组元素的编号索引

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

strftime函数中%s的历史意义是什么?为什么没有记录?

Malloc(sizeof(char[Length]))是否不正确?

#If指令中未定义宏?

Win32API Wizzard97 PropSheet_SetWizButton不工作

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

每个 struct 变量在C中都有自己的命名空间吗?

将数据移动到寄存器时出现分段故障

在Linux上使用vscode和lldb调试用Makefile编译的c代码

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

编译器如何处理具有更复杂值的枚举?

链接到底是如何工作的,我在这里到底做错了什么

使用%f格式说明符打印整数值

宏观;S C调深度

用于计算位数和的递归C函数

为什么GCC 13没有显示正确的二进制表示法?

如何打印循环调度问题的时间表

将不同类型的指针传递给函数(C)

STM32:代码的执行似乎取决于它在闪存中的位置