c++ - 当传递 [] 数组但不传递来自 malloc 的内存时,该方法有效

标签 c++ c arrays memory memory-management

如果没有完整的代码,这个问题可能没有意义,但我将尽力解释它。作为一点背景知识,代码是来自 GitHub 上 OpenThread 项目的片段,但我相信标准 c/c++ 原则仍然适用于此。

该代码的目的是将一段数据(在本例中为字符串)附加到 OpenThread (ot) 消息上。它采用 otMessage、缓冲区(带有数据)和要复制到 otMessage 中的缓冲区长度作为参数。我不太确定 otMessageAppend 是如何工作的,错误完全有可能是在读取缓冲区的方式上,如果是这种情况,则无能为力。

以下 C++ 代码是起点:

char command[] = "abcdef";
SuccessOrExit(error = otMessageAppend(message, &command, (uint16_t)strlen(command)*sizeof(char)));

当在另一端收到消息时,我得到abcdef

当将 abcdef 作为 argv[4] 传递时,此代码可以完美运行:

char command[strlen(argv[4])+1];//+1 for the null terminator
strcpy(command, argv[4]);
SuccessOrExit(error = otMessageAppend(message, &command, (uint16_t)strlen(command)*sizeof(char)));

但是尝试使用 malloc 分配内存会导致另一端出现垃圾(正确的字节数,但不正确的数据):

char *command;
command = (char *) malloc(strlen(argv[4])+1);
strcpy(command, argv[4]);
SuccessOrExit(error = otMessageAppend(message, &command, (uint16_t)strlen(command)*sizeof(char)));

我对此有几个问题:

  1. 根据我的理解,使用 char array[size] 声明内存有什么问题吗?区别在于使用 [] 将在堆栈中分配内存,而 malloc 在堆中分配内存。
  2. 如果我应该使用malloc,我如何确保正确的内存片段将“附加到消息中”,而不仅仅是垃圾

如果了解 otAppendMessage 的工作原理很重要,我可以深入研究源代码并找到它。

最佳答案

&command替换为command

两个片段都不好,但第一个片段恰好可以工作,因为数组的地址与其第一个元素的地址相同,并且如果参数的类型为 void*,则两者表达式产生相同的转换后的参数。在第二个片段中,指针的地址很可能等于指针的值(因为 malloc 的无别名保证)。

关于c++ - 当传递 [] 数组但不传递来自 malloc 的内存时,该方法有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43467730/

相关文章:

c++ - 在 ostream 中使用迭代器失败

c - 链接到库时,include 和 link 有什么区别?

c++ - 为什么无法访问的代码在 C++ 中不是错误?

javascript - 删除 JSON 对象中的键但想保留原始值

c - 通过二维数组中对角线元素的总和验证八皇后解

c++ - 下标值不是数组、指针或 vector ,C++

c++ - Qt:QString 中的文件路径

c++ - 在 SOLARIS 上使用 C++ Pair 初始化 C++ std 映射时出错

c++ - 如何根据输入从数组中检索元素?

c - 用于检测内存损坏的 Linux C 调试库