使用memcpy复制内存块时出现问题
在下面的代码中,我使用malloc(r*c*sizeof(double*)创建了使用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+
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
的指针需要ndouble
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) */