You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用指针将动态分配数组的元素复制到另一个数组?

问题分析与修正方案

你的代码核心问题出在数组元素复制的循环逻辑上,vec1是指向array指针的二级指针,直接对vec1 + i解引用会导致错误的内存偏移,进而触发未定义行为(比如程序崩溃)。

错误原因解释

vec1的类型是double**,vec1 + i表示的是偏移i个double*类型的长度(而非数组元素的长度),此时再两次解引用**(vec1 + i),访问的根本不是array数组的元素地址,而是完全无关的内存区域,必然出错。

修正后的完整代码

首先要确保SIZE是已定义的常量,比如#define SIZE 5,然后修改复制逻辑:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // 使用memcpy时需要该头文件

#define SIZE 5

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; // 简化写法,等价于*(addVec + i)
        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");
    // 方法1:数组下标写法(最直观)
    for (int i = 0; i < SIZE; ++i)
    {
        (*vec1)[i] = addVec[i];
    }

    // 方法2:指针偏移写法(和方法1等价)
    // for (int i = 0; i < SIZE; ++i)
    // {
    //     *(*vec1 + i) = *(addVec + i);
    // }

    // 方法3:memcpy(更高效,适合大数组)
    // memcpy(*vec1, addVec, SIZE * sizeof(double));

    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 += 1;
    }
    printf("The address of array is: %p \n", (void*)array); // 用%p打印指针是C标准规范,避免用%x

    changeArray(&array);

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

    free(array);

    return 0;
}

关键修正点说明

  1. 复制逻辑修正:先通过*vec1解引用得到array的一级指针,再用(*vec1)[i]访问array的第i个元素,这才是正确的内存访问方式。
  2. 指针打印规范:打印指针地址必须用%p格式化符,同时将指针强制转为void*,这是C语言标准规定的可靠写法,比%x更适配不同平台。
  3. 可选优化:如果数组元素数量较多,用memcpy直接复制连续内存块会比循环逐个复制更高效,记得提前包含<string.h>头文件。

内容的提问来源于stack exchange,提问作者Lucky Im

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:17:29