2017-04-18 47 views
-2

这个问题可能没有意义,没有整个代码,但我会尽我所能解释它。作为一段背景,代码是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

当传递abcdefargv[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))); 

我有这几个问题:

  1. 这有什么错从我的理解,宣布使用char array[size]内存区别在于使用[]将在堆栈中分配内存,而malloc将在堆中分配内存。
  2. 如果我应该使用malloc我如何能确保正确的存储器件作品将获得“附加信息”并不仅仅是垃圾

如果它知道如何otAppendMessage作品我可以通过挖至关重要源代码并找到它。

+0

当'command'是一个指针时,'&command'有不同的含义。你得到一个指向指针的指针,而不是指向字符串的指针。 –

+3

你正在编程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))? –

+0

如果它是C++,那么为什么不用'new'而不是'malloc'?为什么不'std :: string'而不是'char *'? – Rogus

回答

3

替换&commandcommand

这两个片段都不好,但第一个片段恰好工作,因为该数组的地址与其第一个元素的地址相同,并且如果该参数的类型为void*,则两个表达式都会导致相同的转换参数。在第二个片段中,指针的地址肯定是而不是等于指针的值(因为malloc的无别名保证)。

+0

如果代码片段不好,我可以采取哪些措施来改进它们,是否有任何优势使用'malloc'来实现 –

+1

@CampbellWray:你可以做的改进就是用'command'替换'&command',正如答案所述。是否使用自动或动态内存取决于您的较大设计要求(字符串大小,使用寿命);你需要自己做出这个决定。 –

+1

@CampbellWray你需要删除两个**版本中的**。 –

相关问题