当前位置: 首页 > 知识库问答 >
问题:

C:如何使用带有指针**的memcpy?

丁和歌
2023-03-14

我使用这个代码:

memcpy(arr[i], arr1[i], sizeof(arr1[i]));

定义:

double** arr;           // arr1 is difined the same way.
arr = new double*[row];
for (int i = 0; i < row; ++i) {
    arr[i] = new double[col];
    memcpy(arr[i], arr1[i], sizeof(arr1[i]));
}

我用命令构建它:g-Wall-Wextra-Wpedantic-c arr.cpp,结果是:

警告:在“void*memcpy(void*,const void*,size_t)”调用中“大小”的参数与目标的指针类型“双*”相同;预期的“双倍”或显式长度 [-Wsizeof-指针-内存]

memcpy(arr[i], arr1[i], sizeof(arr1[i]));
                             ^

我不明白它是什么。你能告诉我如何使它正确工作吗?

共有3个答案

何向荣
2023-03-14

试试大小(双倍) * 列代替。sizeof() 不知道你传递给了新参数的是什么参数。

滕成双
2023-03-14

一个小的可视化可以帮助您更好地理解警告。

假设行=2,列=2。上图显示了arr1[0]的可视化。

在你的代码< code>memcpy(arr[i],arr1[i],sizeof(arr 1[I]); < code > sizeof(arr 1[I])得出double*的大小(由@πάντα ῥεῖ).表示如上图所示,< code>arr1[0]是一个指向double的指针,因此< code>sizeof(arr1[0])可以取值4或8,具体取决于您运行的是32位还是64位应用程序。

如果col=2,则arr1[0]可以保存两个双精度值,即arr1[0][0] ,如图所示。由于要复制整行,您必须指定 arr1[0]所持有的字节长度,可以通过@ToddChristensen或 sizeof(arr1[i][0])*colsizeof来实现。

由于您收到的警告要求指定显式长度,因此您必须使用下面的memcpy才能使复制操作正常工作。

memcpy(arr[i], arr1[i], sizeof(arr1[i][0])*col);

希望这有帮助!

张和颂
2023-03-14

< code>sizeof(arr1[i])得出< code>double*指针变量的大小,而不是您分配的数组的实际大小。

这个警告是完美的,非常感谢。

 类似资料:
  • 当我尝试编译此代码时: 它给了我这个错误: pruebaso. c:在函数'main'中: pruebaso.c:5:9:警告:内置函数“printf”的隐式声明不兼容 [默认启用] printf(" x的值是%f,x的地址是%ld\n ",x, ^ pruebaso. c: 5:9:警告:格式'%ld'需要类型为'long int'的参数,但参数3的类型为'浮点数*'[-Wformat=] 我在

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • C++ 函数 向函数传递参数的指针调用方法,把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。 按指针传递值,参数指针被传递给函数,就像传递其他值给函数一样。因此相应地,在下面的函数 swap() 中,您需要声明函数参数为指针类型,该函数用于交换参数所指向的两个整数变量的值。 // 函数定义 void swap(int *x, in

  • 问题内容: 这是指向指针的指针 您何时真正使用此功能?您可以适当地提出一些可以更轻松地执行其他操作的方法,但这不是我要的。我真的想知道您将在生产中使用此功能吗? 问题答案: 将指针传递给某物的目的是是否 需要 修改指向的值。(我们也使用指针来避免在传递时复制大型数据结构,但这只是为了优化。) 像这个例子一样: 预期的输出(在Go Playground上尝试): 如果of的参数仅接收,则只能修改副本

  • 学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <iostr

  • 所以我有一个堆栈,它允许典型的Push和Pop函数。我很难理解这一切实际上是如何在代码方面工作的。我在这里看到了这篇文章,最佳答案中的图片/图表,展示了列表是如何被“推”下来的,你指向最新的元素。我有一个 它挂接到结构“节点” 我如何结合一个推拉与"节点*下一步;"?最难理解的是我将如何真正做到这一点。我知道它最初指向空,然后如果我推一个2,4,6,它将是6,4,2,#。掌握如何实际使用链表中的指