c - 使用 memcpy 复制内存块时出现问题

标签 c

在下面的代码中,我创建了 buffer作为使用 malloc(r * c * sizeof(double*)); 创建的二维数组。我想复制buffer的前12个元素(即前 4 行)进入第二行 temp使用memcpy .

double *buffer = malloc(10 * 3 * sizeof(double*));
double *temp = malloc(4 * 3 * sizeof(double*));

    for (int i = 0; i < 4; ++i) {
        memcpy(*(temp+ i*3), *(buffer + i*3), 3 * sizeof(double));
    }

我收到此错误:

memcpy(*(temp+ i*3), *(buffer + i*3), 3 * sizeof(double));
       ^~~~~~~~~~~~~~~~~~~~~~~~~~

谁能告诉我为什么?

提前谢谢您。

最佳答案

double *buffer = malloc(10 * 3 * sizeof(double*));

这是错误的,指向 double 的指针需要 n 个 double 的空间(而不是 n 个指向 double 的指针)

更改为

double *buffer = malloc(10 * 3 * sizeof(double));

临时相同

I want to copy the first 12 elements of buffer (i.e. the first 4 rows) into the second one temp using memcpy

用途:

memcpy(temp, buffer, sizeof(double) * 12);

I get this error:

> memcpy(*(temp+ i*3), *(buffer + i*3), 3 * sizeof(double));
>        ^~~~~~~~~~~~~~~~~~~~~~~~~~

Can someone tell me why?

memcpy 想要一个指针(一个地址),但您正在取消引用该指针(因此传递一个像 3.14 这样的值而不是地址)

你想要一个真正的二维数组吗?

在这种情况下你应该使用

double (*buffer)[cols] = malloc(sizeof(*buffer) * rows); /* VLA (since C99) */

查看 defining a 2D array with malloc and modifying it

关于c - 使用 memcpy 复制内存块时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39354159/

相关文章:

c++ - 管理二维 CUDA 阵列

c - Vanilla C 下降替代英特尔内在函数?

c - 为什么有两个返回寄存器(在许多过程调用约定/ABI 中)

c - 将枚举类型转换为 void* 是错误的/危险的吗?

c - 什么 ((void (*)())buf)();意思?

C 数字字节表示

c - 这种情况下如何实现信息隐藏呢?

c - exec() C 中的任何命令

c++ - 为什么我需要在多线程程序中使用 Pthread_sigmask 来确保设置处理程序正在处理信号?

c - ncurses 程序在 PuTTY 以外的任何东西上崩溃