0

Visual Studio のリリース モードで複数回 (50 回以上) 実行した後にのみクラッシュする、誤ったコードを作成しました。このコードが以前にクラッシュしなかった理由を誰か説明できますか

char *pcBuffer= "Some Text";
char *pctempBuff = NULL;

    pctempBuff = malloc(100);
    memset(pctempBuff,0,100);
    memcpy(pctempBuff,pcBuffer,100);

上記のコードは、複数回実行するとクラッシュしました。

次の正しいコードに修正し、クラッシュしなくなりました

char *pcBuffer= "Some Text";
char *pctempBuff = NULL;

pctempBuff = malloc(strlen(pcBuffer)+1);
memset(pctempBuff,0,strlen(pcBuffer)+1);
memcpy(pctempBuff,pcBuffer,strlen(pcBuffer)+1);
4

2 に答える 2

3

最初のコードには 2 つのエラーがあります。

malloc失敗してメモリ不足に戻る可能性がありNULLます。mallocメモリを解放せずに割り当て続けると、システムは最終的にメモリを使い果たし、NULL. これをテストする必要があります

pctempBuff = malloc(100);
if (pctempBuff != NULL) {
    memset(pctempBuff,0,100);
    memcpy(pctempBuff,pcBuffer,strlen(pcBuffer)+1);
}

memcpyまた、10バイトのアドレスから100バイトをコピーするように指示することで、所有していないメモリを読み取っていましたpcBuffer。これにより、未定義の動作が発生します。一見成功したように見える反復が何度も繰り返された後のクラッシュは、(可能性が低いとしても) この例の可能性があります。のメモリのみを読み取るため、2 番目の例は正しいですpcBuffer

文字列をコピーしているので、これをより明確に/簡単に/安全に行うことができますstrcpy

pctempBuff = malloc(100);
if (pctempBuff != NULL) {
    strcpy(pctempBuff,pcBuffer);
}
于 2013-08-08T14:20:09.323 に答える
0

最初のケースで割り当てられたメモリを超えて読んでいますpcBuffer。これは未定義の動作です。そのようなプログラムの動作について予測することはできません。実際、長い間適切に動作し、クラッシュすることはありません。

これは最も明白なエラーであり、malloc失敗しないことも確認する必要がありますが、これはより大きなコードのサンプルにすぎないため、それが実際の問題なのか、単にコードを省略しただけなのかは不明です。

于 2013-08-08T14:20:18.963 に答える