1

問題を解決しようとして、誤って次のコードをコードに入れました。

/* simplified for context*/
char *command = NULL;
char *new_command = (char *) malloc(10);
 ...
free(command);
command = (char *) malloc (new_command + 1);
strcpy(command, new_command);

問題なく実行されただけでなく、元の問題も解消されました。その後、コードを次のように修正しました。

command = (char *) malloc (strlen(new_command) + 1); 

これも機能しますが、修正する前になぜ機能したのか、正確には何をしていたのかを理解したいと思います。

編集:実際には...コマンドで省略されたコードに割り当てられ、データが保存されていました。command と new_command の両方にメモリが割り当てられ、free を呼び出す前にデータが格納されていました。これらは他の関数で割り当てられました。1 つは最初に読み込まれたファイルからのもので、もう 1 つは TCP ソケット接続を介して受信されました。プログラムは、クライアントからのコマンドを、ファイルからのパスを含む現在の正確な実行可能ファイルと照合し、そのコマンドを呼び出します。何が起こったのか、そしてmallocへの間違った呼び出し(サイズの代わりにポインターを渡す)でまったく機能しなかった理由とは何の関係もないと思ったので、最初からすべてを残しました。

4

4 に答える 4

3
 /* simplified for context*/
   char *command = NULL;

null ポインターを宣言する

   char *new_command = (char *) malloc(10);

10バイトの文字配列へのポインターを宣言する

    ...
   free(command);

null ポインターを解放します。何もしないでください。

   command = (char *) malloc (new_command + 1);

new_command + 1バイトの文字配列へのポインターを宣言します。の値new_commandはアドレスです。したがって、それが何であれ、プラス は、1割り当てるバイト数です。したがって、アドレスが の場合、バイト0x550000が割り当てられます。0x550001

   strcpy(command, new_command);

null ( のバイト) が検出されるまで、new_commandからまでのバイトをコピーします。(バイトが割り当てられている)バッファーには、事前に定義されたものは何も書き込まれません。したがって、コードがそれに属していないメモリにアクセスする前に のバイトにヒットした場合、プログラムは正常に実行され、その時点までバッファ内にあるがらくたをコピーします。属していないメモリに入る前に に遭遇しない場合、セグメンテーション違反または同様のエラーで終了します。command0new_command100new_commandcommand0

于 2013-08-30T20:21:39.253 に答える
3

私はあなたが話していると仮定しますcommand = (char *) malloc (new_command + 1);

この呼び出しでは、new_commandポインターの整数値が 1 ずつインクリメントされ、(おそらく非常に大きな領域の) メモリが割り当てられます。

new_commandは へのポインタであると仮定します0x00103456。あなたは基本的に言っています:

command = (char *) malloc( 0x00103456 + 1 );

また

command = (char *) malloc( 1061974 + 1 );

また

command = (char *) malloc( 1061975 );
于 2013-08-30T20:21:03.023 に答える
2

未定義の動作のアーティファクトを観察しているだけです(最後の行について)。何が起こった可能性があります。

于 2013-08-30T20:17:17.610 に答える