C++甚至在进入函数之前就出现段错误

标签 c++ segmentation-fault

我在尝试压缩文件数据时遇到问题。一切都与压缩调用有关,但它不是压缩调用本身,因为在它之前抛出了段错误。展示我的代码会让它更清晰:

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)

最佳答案

字符输出缓冲区[1073741824];

这太大了,无法放入堆栈

关于C++甚至在进入函数之前就出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15125891/

相关文章:

c - 段错误,在 C 中初始化递归结构

c - Fgets() 在一个操作系统上导致段错误,但在另一个操作系统上不会

c++ - C++中的内存修改

c++ - 这是数组初始化吗?

c - 为什么这个程序会出现段错误?

c - GTK C 段 : Adding new signal causes segv

c++ - 在 gmock 的 EXPECT_CALL 中调用 sleep()

c++ - 如何释放重新分配的内存? C++

c++ - 枚举类在C++中不接受带连字符/破折号的文本

c - 使用 fscanf 将数据输入动态结构指针数组?