0

ファイルのデータを圧縮しようとすると問題が発生します。すべてが圧縮呼び出しまで機能しますが、segfaultがその前にスローされるため、圧縮呼び出し自体ではありません。私のコードを表示すると、それがはるかに明確になります:

std::cout << "FILENAME: ";
std::cin >> filename;

if(!fileExists(filename))
{
    std::cout << "ERR: FILE NOT FOUND." << std::endl;
    continue;
}

std::cout << "Compressing file data...";
writeFile(filename, zlib_compress(readFile(filename)));
std::cout << " Done." << std::endl;

関数zlib_compress..で

std::string zlib_compress(const std::string& str)
{
    std::cout << "DEBUG" << std::endl;

    z_stream zs;                        // z_stream is zlib's control structure
    memset(&zs, 0, sizeof(zs));

    if (deflateInit(&zs, 9) != Z_OK)
        std::cout << "deflateInit failed while compressing." << std::endl;

    zs.next_in = (Bytef*)str.data();
    zs.avail_in = str.size();           // set the z_stream's input

    int ret;
    char outbuffer[1073741824];
    std::string outstring;

    // retrieve the compressed bytes blockwise
    do
    {
        zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
        zs.avail_out = sizeof(outbuffer);

        ret = deflate(&zs, Z_FINISH);

        if (outstring.size() < zs.total_out)
        {
            // append the block to the output string
            outstring.append(outbuffer, zs.total_out - outstring.size());
        }
    } while(ret == Z_OK);

    deflateEnd(&zs);

    if(ret != Z_STREAM_END) // an error occurred that was not EOF
    {
        std::ostringstream oss;
        oss << "Exception during zlib compression: (" << ret << ") " << zs.msg;
        std::cout << oss.str();
    }

    return outstring;
}

私は、その関数には作業が必要であることを知っています。私はそれを試すためにどこかからC&Pしただけです。

しかし、事はこれです:

std::cout << "DEBUG" << std::endl;呼び出されることはありません。コンパイラは、セグメンテーション違反がここから発生していると言います。

  std::string zlib_compress(const std::string& str)
> {

しかし、なぜ...?以前は機能していました。何が悪かったのかわかりません!

編集:デバッガー出力。

#0 00000000 0x00402cbb in __chkstk_ms() (??:??)
#1 004013BE zlib_compress(str=...) (C:\Users\***\Documents\Work\Programming\Compressor\z.cpp:5)
#2 00401DDA _fu15___ZSt4cout() (C:\Users\***\Documents\Work\Programming\Compressor\main.cpp:80)
4

2 に答える 2

6

char outbuffer [1073741824];

大きすぎてスタックに入れることができません

于 2013-02-28T01:33:15.307 に答える
0

zlib_compressのパラメーターとして文字列への定数参照を使用しています。zlib_compressでメモリ(読み取りファイルから返されるものは何でも)が使用可能であることを確認する必要があります。readFile関数のプロトタイプも共有できると便利です。

于 2013-02-28T04:50:50.857 に答える