我被指示使用单个 memcpy
命令将所有元素从我的二维数组 matrix2D
复制到我的 3d 数组 matrix3D
然后打印出 3d 数组(用逗号分隔元素,用分号分隔行,每个 2d 矩阵用新行分隔)。在此之前,程序接受用户输入的 3d 矩阵维度,然后将所有数据输入矩阵( float )。我的函数 malloc2d
和 malloc3d
工作正常,我没有遇到段错误,但是当我尝试 memcpy
数据然后打印 3d矩阵,没有打印。这是代码:
#include "utilities.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
unsigned int dim1,dim2,dim3;
printf("Dimensionality of 3-D matrix ===>");
scanf("%u",&dim1); //takes user input for dimensions
scanf("%u",&dim2); //takes user input for dimensions
scanf("%u",&dim3); //takes user input for dimensions
//allocating memory for 3d, 2d and 1d matrices
float*** matrix3D = malloc3D((unsigned int)(dim1), (unsigned int)(dim2), (unsigned int)(dim3), sizeof(float));
float** matrix2D = malloc2D(dim1, dim2*dim3, sizeof(float));
float* matrix1D = malloc(dim1*dim2*dim3);
for(int i = 0; i<(dim1*dim2*dim3); i++){ //taking user input floats
fscanf(stdin, "%f", &matrix1D[i]);
}//for
for(int i = 0; i<(dim1*dim2*dim3); i++){//writing contents of 1d matrix to 2d matrix
matrix2D[i/(dim2*dim3)][i%(dim2*dim3)] = matrix1D[i];
}//for
for (int i = 0; i < dim1; i++){//printing out 2d array as asked
for (int j = 0; j < (dim2*dim3); j++){
printf("%0.2f", matrix2D[i][j]);
if(j==((dim2*dim3)-1)){
printf(";");
}//if
else{
printf(",");
}//else
}//for
}//for
printf("\n"); //new line for readability
memcpy(matrix3D, matrix2D, dim1*dim2*dim3*sizeof(float));
for (int i = 0; i < dim1; i++){//printing out 3d array as asked
for (int j = 0; j < dim2; j++){
for(int k = 0; k < dim3; k++){
printf("%0.2f", matrix3D[i][j][k]);
if(j==((dim2)-1)){
printf(";");
}//if
else if(k==((dim3)-1)){
printf("\n");
}//else if
else{
printf(",");
}//else
}//for
}//for
}//for
free3D(matrix3D);
free2D(matrix2D);
free(matrix1D);
} //main
给出的示例输入和输出是(除了最后两行 - 3d 矩阵,我打印了所有内容):
这里有 malloc2D、malloc3D、free2D 和 free3D。我的印象是他们是对的,因为他们是在我们都没有得到它之后才给我们的。
void** malloc2D(size_t rows, size_t cols, size_t sizeOfType){
void* block = malloc(sizeOfType * rows * cols);
void** matrix = malloc(sizeof(void*) * rows);
for (int row = 0; row < rows; ++row) {
matrix[row] = block + cols * row * sizeOfType;
}//for
return matrix;
}//malloc2D
void free2D(void*** matrix){
free((*matrix)[0]);
free((*matrix));
*matrix = NULL;
}//free2D
void*** malloc3D(size_t depth, size_t rows, size_t cols, size_t sizeOfType){
void* block = malloc(sizeOfType * rows * cols * depth);
void** matrix = malloc(sizeof(void*) * rows * depth);
void*** matrix2 = malloc(sizeof(void**) * depth);
for (int depth1 = 0; depth1 < depth; ++depth1) {
matrix2[depth1] = (void**)(matrix + depth * rows * sizeof(void**));
for(int row = 0; row < rows; ++row){
matrix[depth1 * rows + row] = block + (depth1 * rows + row) * cols * sizeOfType;
}//for
}//for
return matrix2;
}//malloc3D
void free3D(void**** matrix){
free((*matrix)[0][0]);
free((*matrix)[0]);
free((*matrix));
*matrix = NULL;
}//free3D
最佳答案
使用单个 memcpy
将 2d 数组复制到 3d 数组的唯一方法是,如果每个 2d 和 3d 数组的数据在内存中都是平坦的。
为您提供的分配函数表明每个函数的数据都是连续的。因此,需要将二维数组的数据段复制到三维数组的数据段中。
由于数据是连续的,因此数据部分位于数组第一个元素的地址。因此,二维数组的数据部分开始于 &matrix2D[0][0]
,而三维数组的数据部分开始于 &matrix3D[0][0][0]
。鉴于数组语法的语义,这些表达式分别与 matrix2D[0]
和 matrix3D[0][0]
相同。
假设 matrix1D
被正确初始化:
memcpy(matrix2D[0], matrix1D, dim1*dim2*dim3*sizeof(float));
memcpy(matrix3D[0][0], matrix2D[0], dim1*dim2*dim3*sizeof(float));
关于使用 C 中的 memcpy 将 2D 矩阵复制到 3D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48893797/