如何用指针将动态分配数组的元素复制到另一个数组?
问题分析与修正方案
你的代码核心问题出在数组元素复制的循环逻辑上,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; }
关键修正点说明
- 复制逻辑修正:先通过
*vec1解引用得到array的一级指针,再用(*vec1)[i]访问array的第i个元素,这才是正确的内存访问方式。 - 指针打印规范:打印指针地址必须用
%p格式化符,同时将指针强制转为void*,这是C语言标准规定的可靠写法,比%x更适配不同平台。 - 可选优化:如果数组元素数量较多,用
memcpy直接复制连续内存块会比循环逐个复制更高效,记得提前包含<string.h>头文件。
内容的提问来源于stack exchange,提问作者Lucky Im
相关产品推荐
相关产品推荐

