2017-04-18 4 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))); 

このコードは完璧に動作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]を使用してメモリを宣言するに何か問題が

  1. あります:

    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はヒープにメモリを割り当てます。

  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++なら 'malloc'の代わりに' new'を使うのはなぜですか? 'char *'の代わりに 'std :: string'を使うのはなぜでしょうか? – Rogus

答えて

3

&commandcommandに置き換えます。

両方のスニペットが不良ですが、配列のアドレスが最初の要素のアドレスと同じであるために最初のコードが実行され、パラメータの型がvoid*の場合、両方の式は同じ変換引数。 2番目のスニペットでは、ポインタのアドレスはではなくではありません(mallocのno-alias保証のため)。

+0

スニペットが悪い場合、私はそれらを改善するために何かできることがあります、それを行う 'malloc'の方法の利点はありますか? –

+1

@CampbellWray:あなたがそれらを改善するためにできることは、答えが言うように 'command'で'&command'を置き換えることです。自動または動的メモリを使用するかどうかは、より大きな設計要件(文字列サイズ、有効期間)に依存します。あなたは自分でその決定をする必要があります。 –

+1

@CampbellWray両方の**バージョンで '&'を削除する必要があります。 –

関連する問題