這個問題可能沒有意義,沒有整個代碼,但我會盡我所能解釋它。作爲一段背景,代碼是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