c++甚至在进入一个函数之前就得到一个seg错误

C++ getting a seg fault before even entering a function

本文关键字:一个 错误 seg 函数 c++      更新时间:2023-10-16

我有一个问题,我试图压缩文件的数据。所有的工作都是为了压缩调用,但它不是压缩调用本身,因为在它之前抛出了段错误。显示我的代码将使它更清晰:

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;
}

我知道,我知道,这个函数需要工作,我只是从某个地方p来试试。

但问题是:

std::cout << "DEBUG" << std::endl;从不调用。编译器说segfault来自这里:

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

但为什么……?它早些时候还在工作。我只是不知道哪里出了问题!

Edit:调试器输出

#0 00000000 0x00402cbb in __chkstk_ms() (??:??)
#1 004013BE zlib_compress(str=...) (C:Users***DocumentsWorkProgrammingCompressorz.cpp:5)
#2 00401DDA _fu15___ZSt4cout() (C:Users***DocumentsWorkProgrammingCompressormain.cpp:80)

char outbuffer[1073741824];

太大了,不能放到堆栈中

您在zlib_compress中使用对字符串的常量引用作为参数-您需要确保zlib_compress中的内存可用(无论从readfile返回的是什么)。如果您也能分享readFile函数的原型,那就太好了。

相关文章: