この質問はコード全体では意味をなさないかもしれませんが、私はそれを説明するために最善を尽くします。ちょっとした背景として、このコードは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)));
このコードは完璧に動作argv[4]
としてabcdef
を渡されたとき、私はabcdef
を得る:
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 array[size]
を使用してメモリを宣言するに何か問題が
- あります:
char *command; command = (char *) malloc(strlen(argv[4])+1); strcpy(command, argv[4]); SuccessOrExit(error = otMessageAppend(message, &command, (uint16_t)strlen(command)*sizeof(char)));
私はこれについていくつかの質問を持っています違いは
[]
を使用するとスタックにメモリが割り当てられ、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++なら 'malloc'の代わりに' new'を使うのはなぜですか? 'char *'の代わりに 'std :: string'を使うのはなぜでしょうか? – Rogus