なぜ私はこの映画に影響をうけましたダブルの無料エラー realloc()?

StackOverflow https://stackoverflow.com/questions/1145

  •  08-06-2019
  •  | 
  •  

質問

私は書いてみました文字列の置換機能にはC、 char *, して割り当ての使用 malloc().では、少し異なることで検索して置換文字列ではなく文字の文字列になります。

でない場合、検索と置換文字列と同じ長さ(または置換文字列はより短いときは、検索文字列)は、私は十分なスペース割り当てられます。また利用しよう realloc(), 私はエラーが出るかをやっていダブルの無ると思いますかかいめんのみを使用 realloc().

その少しのコードす:

void strrep(char *input, char *search, char *replace) {
    int searchLen = strlen(search);
    int replaceLen = strlen(replace);
    int delta = replaceLen - searchLen;
    char *find = input;

    while (find = strstr(find, search)) {

        if (delta > 0) {
            realloc(input, strlen(input) + delta);
            find = strstr(input, search);            
        }

        memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
        memmove(find, replace, replaceLen);
    }
}

のプログラムの作品までしてい realloc() インスタンスの置換文字列が長くなり、初期文字列になります。でもどんな作品において、吐出誤差などの結果が出ています。

場合で、呼び出しコードは次のように記述されています。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void strrep(char *input, char *search, char *replace);

int main(void) {
    char *input = malloc(81);

    while ((fgets(input, 81, stdin)) != NULL) {
        strrep(input, "Noel", "Christmas");
    }
}
役に立ちましたか?

解決

原則として、 ない い無料またはreallocユーザーに提供バッファです。わからないが、ユーザーに割り当てスペースのモジュールは、他のDLL)のように利用できませんの配分機能をユーザバッファです。

提供ができな再配分を内での機能ではその動作を少しのように行うのみの交換で、ユーザーできる計算結果の最大文字列の長さを提供するためにバッファがこの交換が発生している。

そしてこの機能は、複数の代替、または全体のスペースの文字列をコピーし、ユーザの入力文字列になります。を提供しなければなりませんの方を削除する文字列で割り当てられます。

より:

void  strrep(char *input, char *search, char *replace);
char* strrepm(char *input, char *search, char *replace);
void  strrepmfree(char *input);

他のヒント

まず、申し訳ないのです。これは私の初めてのstackoverflowの答えです。:)

などが指摘されており、realloc()が呼び出されます可能性のある変更のポインタのメモリが再配分.その場合、その引数文字列""が無効となります。の場合にも反映されないことがありまで、変更を行うに際して用い範囲の機能を終了する。

回答の生realloc()を返すポインタを新たに再配分。戻り値の可能性のあるどこかということです。一般的に使います:

data *foo = malloc(SIZE * sizeof(data));
data *bar = realloc(foo, NEWSIZE * sizeof(data));

/* Test bar for safety before blowing away foo */
if (bar != NULL)
{
   foo = bar;
   bar = NULL;
}
else
{
   fprintf(stderr, "Crap. Memory error.\n");
   free(foo);
   exit(-1);
}

としてTyBoerポートが指摘するように、皆さん変更することができませんの値をポインタを渡されて、入力です。を割り当てることができないものに変化していくのが対象範囲の終了の機能です。以下のブロックでは、"入力"であるか否かを問わず無効なポインタの機能が完了す:

void foobar(char *input, int newlength)
{
   /* Here, I ignore my own advice to save space. Check your return values! */
   input = realloc(input, newlength * sizeof(char));
}

マークをこの新しいポインタとして出力します。だが、負担の呼び出し側がいかに大きな再利用のポインタを使った入力します。一致する場合の戻り値は、いつのポインタを同じ場所にだけ呼び出す必要は無料()もそのひとつ。決めなければならない試合の入力ポインタの現在ポイントをメモリするものではありませんが所有する。Dereferencingの原因になりますのセグメンテーション。

きダブルポインタを入力す:

void foobar(char **input, int newlength)
{
   *input = realloc(*input, newlength * sizeof(char));
}

場合は、呼び出し側は、重複入力ポインタのどこかに、重複したものが無効です。

と思い、クリーン液は使用は避けrealloc()しようとした場合に変更機能を呼び出し側の入力します。だmalloc()新しいバッファに戻るようになりました呼び出し側かどうかを決める無料の旧します。この追加の利益の呼び出したい文字列で

ただのショットの暗いでいただけると期待しているときはreallocを返しますポインタのようにmalloc.でreallocきのポインタが必要とする営業無効なポインタない場合は、以下の

input = realloc(input, strlen(input) + delta);

誰か謝が遅くなるのに二ヶ月半前のこと。あいお過ごしが多かったのは確かであろうといったソフトウェア考古学.

私は興味がないことについては説明示的にメモリリークのオリジナルデザインまたはoff-by-oneエラーになります。この観測にメモリリークとかそれを願っています"とのダブル-無料エラーが正確にでき抜きと同じメモリを複数回、またはその後、踏みつけ、既に解放されたメモリ).

を行う場合は、事前に、分析、思いと言う方にインターフェースには以下の恒星;ただし、対応のメモリリーク/踏みつけの問題と文書化のあり方を見直すとともに記憶"という要求でき'OK'.

何を指すのですか。、こちらをクリックして下さいパスバッファをrealloc()、realloc()を返します新しいデータへのバッファへのポインタの地域のものを使用できる、または無視することを返します。その結果、realloc()は解放された元のメモリに渡ししますので、同じポインタを再び思いを解放し、同じメモリを回渡ししますので、元の値を設定することができます。これらの漏えいメモリがをすることになりますので引き続き使用のオリジナルの空間--ジョンDowneyディスカッションのポイントを出する誤用realloc()がない強いかを厳しく行っているためです。もあります。off-by-oneエラーがない十分なスペースが割り当NUL'\0'が終了した文字列になります。

のメモリリークが発生するのではないの提供の仕組みの呼び出し側の値の文字列になります。いず踏みつけ、独自の文字列のスペースがなんだかとってもおいしそうにコードを手が合わない場合には呼び出しのコード解放された空間で、ダブル無料に誤りがあるとき、又はこれにコアダンプ等のメモリ制御情報サービスクランブルエッグ.

コードもない保護する無期限の成長替えを考えてみましょう"ノエル"が"Joyeuxノエル'.毎回、追加7文字、もしくは別のノエルの交換テキストの拡大といいます。私の修正(下)はこの問題は簡単に解決でしょうかをチェック検索文字列が表示される置換文字列;代替はキの置換文字列にしてから検索します。第二は自明ではない符号化問題へのアドレスです。

なので、私が示唆された改正の数には:

char *strrep(char *input, char *search, char *replace) {
    int searchLen = strlen(search);
    int replaceLen = strlen(replace);
    int delta = replaceLen - searchLen;
    char *find = input;

    while ((find = strstr(find, search)) != 0) {
        if (delta > 0) {
            input = realloc(input, strlen(input) + delta + 1);
            find = strstr(input, search);            
        }

        memmove(find + replaceLen, find + searchLen, strlen(input) + 1 - (find - input));
        memmove(find, replace, replaceLen);
    }

    return(input);
}

このコードは検出されないメモリの割り当て誤差のみならずクラッシュがない場合には、漏洩メモリの場合realloc()が失敗します。見Steve Maguireの書面に固体コードを書のための広範な協議のメモリ管理の問題です。

注意してみて編集コードにhtmlの脱出。

でも、それらを使ってC/C++、realloc成長を遂げているだけ再利用のメモリのポインタ値がある場合はルームメモリの後、オリジナルのブロックです。

例えば、このことを考え:

(xxxxxxxxxx..........)

場合はポインタをポイントのxです。意味の無料のメモリ場所で、成長するメモリのサイズによって指定された変数による5つのバイトで成功します。これは、簡単な例を次に示してブロックを四捨五入で表示一定のサイズアライメントが。

ただし、その後、育ててみが10バイトが5ご利用に移行する必要があるブロックメモリの更新ポインタです。

しかし、例での機能のポインタを文字ではなく、ポインタ変数は、このようなstrrep機能の内部でものを調整することのできる変数の使用では、局所変数のstrrep機能で、呼び出しのコードは残りのポインタ変数の値です。

このポインタ値として解放されます。

お場合、入力は回数です。

しかし、いく。登場しますが、こちらのように見える 入力 変数が実際に入力する場合は、はずがないをすることができるものとます。

私はこのようにしてみようにしたいことなく、変化する 入力, どの副作用をうけることは時に難しいことがありトラックです。

このようだ。

char *strrep(char *string, const char *search, const char *replace) {
    char *p = strstr(string, search);

    if (p) {
        int occurrence = p - string;
        int stringlength = strlen(string);
        int searchlength = strlen(search);
        int replacelength = strlen(replace);

        if (replacelength > searchlength) {
            string = (char *) realloc(string, strlen(string) 
                + replacelength - searchlength + 1);
        }

        if (replacelength != searchlength) {
            memmove(string + occurrence + replacelength, 
                        string + occurrence + searchlength, 
                        stringlength - occurrence - searchlength + 1);
        }

        strncpy(string + occurrence, replace, replacelength);
    }

    return string;
}

ため息がとにかくポストコードなので吸い?

reallocがらなければならないのに、複雑なき場合の対応のメモリを多くれます。すなわち-で実際にお客様のコードが速くなります。

れによってコードが

realloc(bytes, smallerSize);

用いたリサイズのバッファが小さくなります。た約万人、そして何らかの理由realloc決定されていても短縮のバッファではないでしょうかだ新しいコピーします。なクラッシュランダムな場所の1/2秒後のものである。

使用してください戻り値のrealloc.

私の迅速な示唆を得ることができ

代わりに:
void strrep(char *input, char *search, char *replace)
う:
void strrep(char *&input, char *search, char *replace)

とより、ボディ:
input = realloc(input, strlen(input) + delta);

一般的に読みのお渡しについて関数の引数の値としてスーパーコンピュータを用いた、realloc()の説明:).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top