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

使用memcpy复制内存块时出现问题,c,C,在下面的代码中,我使用malloc(r*c*sizeof(double*)创建了buffer作为二维数组。我想使用memcpy将缓冲区的前12个元素(即前4行)复制到第二个temp double *buffer = malloc(10 * 3 * sizeof(double*)); double *temp = malloc(4 * 3 * sizeof(double*)); for (int i = 0; i < 4; ++i) { memcpy(*(temp+

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

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));
    }
有人能告诉我为什么吗

先谢谢你

double *buffer = malloc(10 * 3 * sizeof(double*));
这是错误的,指向
double
的指针需要n
double
s的空间(而不是指向
double
的n个指针)

改为

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

我想复制缓冲区的前12个元素(即前4个元素 使用memcpy将行)转换为第二个临时值

使用:

我得到这个错误:

memcpy(*(temp+ i*3), *(buffer + i*3), 3 * sizeof(double));
       ^~~~~~~~~~~~~~~~~~~~~~~~~~
有人能告诉我为什么吗

memcpy
需要一个指针(一个地址),但您正在取消对指针的引用(从而传递一个类似
3.14
的值,而不是地址)

你想要一个真正的2D阵列吗

在这种情况下,您应该使用

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

看看

这肯定不是编译器诊断的全部?没有2D数组,而是1D数组。为什么不使用2D数组,而是手动进行索引计算?错误消息是什么?请参阅并提供一个。您能告诉我们错误是什么吗?这是错误:`error:passing'double'给不兼容类型'const void*`的参数,或者使用2D数组……非常感谢much@Olaf,你是对的,但在我看来OP想要一个平面2D数组(由于malloc中传递的维度)@奥特曼:你必须把尺寸传递给马洛克。我不认为OP需要1D阵列。他可能不知道还有更好的选择。(无论如何,获取元素大小的更好方法是
sizeof(*buffer)
,而不是显式重复类型。是的,这也适用于指向VLA的指针。是的,您提到的替代方法非常好。但是,它说:
需要复合数组初始值设定项。
。您知道这意味着什么吗
> memcpy(*(temp+ i*3), *(buffer + i*3), 3 * sizeof(double));
>        ^~~~~~~~~~~~~~~~~~~~~~~~~~
double (*buffer)[cols] = malloc(sizeof(*buffer) * rows); /* VLA (since C99) */