这个问题可能没有意义,没有整个代码,但我会尽我所能解释它。作为一段背景,代码是GitHub上OpenThread项目的一个片段,但我相信标准c/C++原则在这里仍然适用。方法工作时传递[]数组而不是内存malloc
该代码的目的是将一段数据(在本例中是一个字符串)附加到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
导致垃圾出来th Ë另一端(正确的字节数,但不正确的数据):
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'有不同的含义。你得到一个指向指针的指针,而不是指向字符串的指针。 –
你正在编程C或C++吗?他们是不同的语言,真正表现不同。考虑到你使用[可变长度数组](https://en.wikipedia.org/wiki/Variable-length_array)和'malloc',我假设你实际上用C语言编程(在这种情况下,你应该阅读[ 'malloc']的结果(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc))? –
如果它是C++,那么为什么不用'new'而不是'malloc'?为什么不'std :: string'而不是'char *'? – Rogus