2017-04-18 57 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你需要刪除兩個**版本中的**。 –

相關問題