c - 使用 memmove 将元素移动一个索引

标签 c multidimensional-array memmove

我正在尝试将动态创建的 3d 数组中的元素移动一个索引,以便每个元素 [i][j][k] 都应该位于 [i+1 ][j][k].

这就是我创建数组的样子

typedef struct stencil{
int ***arr;
int l;
int m;
int n;}matrix;

void createMatrix(matrix *vector){

vector->arr = (int***) malloc(sizeof(int**) * (vector->l+2));
for (int i = 0; i< vector->l+2; ++i) {
    vector->arr[i] = (int**) malloc(sizeof(int*) * (vector->m+2));
    for (int j = 0; j < vector->m+2; ++j) {
        vector->arr[i][j] = (int*) calloc((vector->n+2),sizeof(int));
    }

}
}

这基本上就是我想用 memmove 实现的

for(int i = vector->l-1; i >= 0; --i){
    for(int j = vector->m; j >= 0; --j){
        for(int k = vector->n; k >= 0; --k){
            vector->arr[i+1][j][k] = vector->arr[i][j][k];
        }
    }
}

出于某种原因,memmove 移动了 2 个索引。

memmove(&(vector->arr[1][1][1]), &(vector->arr[0][1][1]), (vector->l+2)*(vector->m+2)*(vector->n)*sizeof(int*));

谁能给我一个提示?

最佳答案

当您像这样创建一个动态多维数组时,数组内容不是连续的——每一行都是一个单独的分配。所以你不能用一个 memmov() 移动它。

但不需要复制所有数据,只需将顶层数组中的指针移位即可。

int **temp = arr[l-1]; // save last pointer, which will be overwritten
memmov(&arr[1], &arr[0], sizeof(*arr[1]));
arr[0] = temp;

我已将最后一个元素移到第一个,以避免两个元素指向相同的数据。您还可以释放旧的最后一个元素(包括释放它指向的数组)并创建一个新的第一个元素,但这更简单。

关于c - 使用 memmove 将元素移动一个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47983705/

相关文章:

c - UTF-16 文件无法正确打印

arrays - 在 D 中切片二维数组

c++ - 英特尔 MKL 是否支持 Armadilo、Eigen 或 Biltz++?

c++ - 为什么我不能 memmove std::string?

c - memmove 实际上是 "move"一 block 内存并在源头留下零吗?

c - 修复 AddressSanitizer : strcpy-param-overlap with memmove?

objective-c - 在 C 或 Objective-C 中获取目标文件所属的静态库名称的最佳方法是什么?

python - 如何从 C 代码访问 python bool 变量?

c - Eclipse SDK 程序 "cl"在 PATH 错误中找不到

python - 替换通过索引数组访问的 numpy ndarray 中的元素