このプログラムが必要以上のメモリを割り当てるのはなぜですか?

AJ-ウィリアムズ1

stdinから読み取る必要のあるプログラムをCで書いています。必要以上のメモリを割り当てたくないので、入力をチャンクでmalloc読み取り、新しいチャンクが読み取られるたびにより多くのメモリを使用しています。

コードallocdは次のとおりです(変数は割り当てられたメモリの量を追跡するためだけのものです)。

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

#define SIZ 20

int main(int argc, char *argv[])
{
    char *str = malloc(1), *p = NULL;
    *str = '\0';
    char buf[SIZ];
    int bufs = 0;
    int allocd = 0;

    while (p = fgets(buf, sizeof(buf), stdin))
    {
        /* grow str */
        str = realloc(str, bufs * SIZ + SIZ);
        allocd = bufs * SIZ + SIZ;
        strcat(str, buf);
        bufs++;

        if (!p)
            break;
    }

    printf("ALLOC'D: %i", allocd);

    free(str);
}

テスト用に、次のファイルfile.txtを使用するとわかるように、966文字のファイルがありますwc

$ wc -m file.txt
966 file.txt

問題は、次のように、私のプログラムがファイル内の文字よりもはるかに多くのバイトのメモリを割り当てているように見えることです。

$ ./code <file.txt
ALLOC'D: 1680

なぜこれが起こっているのですか、どうすれば修正できますか?

タッドマン

実際の行の長さに関係なく、読み取った(試行した)ごとに新しいメモリチャンクを割り当てます私はfgetsここで間違ったツールであると主張します、あなたが望むのはfread代わりに:

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

#define SIZ 20

int main(int argc, char *argv[])
{
    char *str = malloc(1);
    *str = '\0';
    char buf[SIZ];
    int allocd = 0;

    int p;

    // Note: fread() returns size_t number of records read, NOT a char*
    while ((p = fread(buf, 1, sizeof(buf), stdin)))
    {
        str = realloc(str, allocd + p + 1);

        // Concatenate the buffer
        memcpy(str + allocd, buf, p);

        allocd += p;
    }

    str[allocd + 1] = 0;

    printf("ALLOC'D: %i", allocd);

    free(str);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

なぜこのHaskellプログラムはそれほど多くのメモリを割り当てているのですか?

分類Dev

NumPy配列が必要以上に*少ない*メモリを使用するのはなぜですか?

分類Dev

このJavaプログラムがメモリを大量に消費するのはなぜですか?

分類Dev

Matplotlibは、グラフに必要以上のプロットを追加することがあります

分類Dev

プログラムが大量のメモリを使用して実行されるのはなぜですか?

分類Dev

Cプログラムでメモリが割り当てられて使用されるのはいつですか?

分類Dev

プログラムが割り当てることができるメモリの量は?

分類Dev

GCCのifstream >> doubleがこれほど多くのメモリを割り当てるのはなぜですか?

分類Dev

配列に値を割り当てているステートメントでプログラムがループを終了するのはなぜですか?

分類Dev

nasmプログラムが必要以上の引数を出力する

分類Dev

Cプログラムがlibmathの.aよりもlibmathの.soの方が多くのメモリを表示するのはなぜですか?

分類Dev

Collections.sortを使用するこのプログラムがサイズ32以上のリストでのみ失敗するのはなぜですか?

分類Dev

空のJavaプログラムがメモリを消費するのはなぜですか?

分類Dev

プログラムのある時点でfree()を使用しているにもかかわらず、プログラムがCでメモリリークを起こしているのはなぜですか?

分類Dev

FlatButtonが必要以上にスペースをとるのはなぜですか?

分類Dev

この「メモリを割り当てることができません」というエラーが頻繁に発生するのはなぜですか?

分類Dev

プログラムが最初に割り当てられたメモリよりも多くのメモリを必要とする場合はどうなりますか?

分類Dev

メモリの割り当てに関して、このプログラムの正確な流れはどうですか?

分類Dev

このプログラムでfflush(stdin)を使用する必要があるのはなぜですか?

分類Dev

割り当てられるスレッドが少ないと、なぜこのプログラムはより速く実行されるのですか?

分類Dev

静的から同じことを達成できるのに、なぜ動的メモリ割り当てを使用する必要があるのですか?

分類Dev

テストプログラムの後、JVMの空きメモリが増えるのはなぜですか?

分類Dev

ヒープメモリの割り当てがスタックメモリの割り当てよりもはるかに速いのはなぜですか?

分類Dev

このコードが必要以上に長い文字の組み合わせを実行しているのはなぜですか?

分類Dev

割り当てた割引がプログラムで提供されないのはなぜですか?

分類Dev

Javaがメモリ割り当てにヒープを使用するのはなぜですか?

分類Dev

なぜc / c ++でメモリを割り当てる必要があるのですか?

分類Dev

このプログラムが出力を生成するのはなぜですか

分類Dev

このプログラムが「1」を出力するのはなぜですか?

Related 関連記事

  1. 1

    なぜこのHaskellプログラムはそれほど多くのメモリを割り当てているのですか?

  2. 2

    NumPy配列が必要以上に*少ない*メモリを使用するのはなぜですか?

  3. 3

    このJavaプログラムがメモリを大量に消費するのはなぜですか?

  4. 4

    Matplotlibは、グラフに必要以上のプロットを追加することがあります

  5. 5

    プログラムが大量のメモリを使用して実行されるのはなぜですか?

  6. 6

    Cプログラムでメモリが割り当てられて使用されるのはいつですか?

  7. 7

    プログラムが割り当てることができるメモリの量は?

  8. 8

    GCCのifstream >> doubleがこれほど多くのメモリを割り当てるのはなぜですか?

  9. 9

    配列に値を割り当てているステートメントでプログラムがループを終了するのはなぜですか?

  10. 10

    nasmプログラムが必要以上の引数を出力する

  11. 11

    Cプログラムがlibmathの.aよりもlibmathの.soの方が多くのメモリを表示するのはなぜですか?

  12. 12

    Collections.sortを使用するこのプログラムがサイズ32以上のリストでのみ失敗するのはなぜですか?

  13. 13

    空のJavaプログラムがメモリを消費するのはなぜですか?

  14. 14

    プログラムのある時点でfree()を使用しているにもかかわらず、プログラムがCでメモリリークを起こしているのはなぜですか?

  15. 15

    FlatButtonが必要以上にスペースをとるのはなぜですか?

  16. 16

    この「メモリを割り当てることができません」というエラーが頻繁に発生するのはなぜですか?

  17. 17

    プログラムが最初に割り当てられたメモリよりも多くのメモリを必要とする場合はどうなりますか?

  18. 18

    メモリの割り当てに関して、このプログラムの正確な流れはどうですか?

  19. 19

    このプログラムでfflush(stdin)を使用する必要があるのはなぜですか?

  20. 20

    割り当てられるスレッドが少ないと、なぜこのプログラムはより速く実行されるのですか?

  21. 21

    静的から同じことを達成できるのに、なぜ動的メモリ割り当てを使用する必要があるのですか?

  22. 22

    テストプログラムの後、JVMの空きメモリが増えるのはなぜですか?

  23. 23

    ヒープメモリの割り当てがスタックメモリの割り当てよりもはるかに速いのはなぜですか?

  24. 24

    このコードが必要以上に長い文字の組み合わせを実行しているのはなぜですか?

  25. 25

    割り当てた割引がプログラムで提供されないのはなぜですか?

  26. 26

    Javaがメモリ割り当てにヒープを使用するのはなぜですか?

  27. 27

    なぜc / c ++でメモリを割り当てる必要があるのですか?

  28. 28

    このプログラムが出力を生成するのはなぜですか

  29. 29

    このプログラムが「1」を出力するのはなぜですか?

ホットタグ

アーカイブ