如果没有完整的代码,这个问题可能没有意义,但我将尽力解释它。作为一点背景知识,代码是来自 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)));
我对此有几个问题:
- 根据我的理解,使用
char array[size]
声明内存有什么问题吗?区别在于使用[]
将在堆栈中分配内存,而malloc
在堆中分配内存。 - 如果我应该使用
malloc
,我如何确保正确的内存片段将“附加到消息中”,而不仅仅是垃圾
如果了解 otAppendMessage
的工作原理很重要,我可以深入研究源代码并找到它。
最佳答案
将&command
替换为command
。
两个片段都不好,但第一个片段恰好可以工作,因为数组的地址与其第一个元素的地址相同,并且如果参数的类型为 void*
,则两者表达式产生相同的转换后的参数。在第二个片段中,指针的地址很可能不等于指针的值(因为 malloc 的无别名保证)。
关于c++ - 当传递 [] 数组但不传递来自 malloc 的内存时,该方法有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43467730/