【问题标题】:c++ vector segmentation faultc++向量分段错误
【发布时间】:2019-11-10 19:34:42
【问题描述】:

我正在尝试在 amazon linux ec2 实例上运行我的 c++ 程序,并在一段在 MacOS 和 Ubuntu 上运行良好的代码中出现分段错误。代码摘录是这样的

    vector<unsigned char> header(8);
    bool bool_byte[8];
    unsigned char seg_byte;
    int byte_num = 0;
    for(int i = 0; i < 32; i++) {
        bool_byte[i] = snb[i];
        if(i % 8 == 7) {
            seg_byte = to_byte(bool_byte);
            byte_num = (i + 1)/8;
            cout << "byte_num minus one is " << to_string(byte_num - 1) << endl;
            cout << "vector size " << to_string(header.size()) << endl;
            header[byte_num - 1] = seg_byte;
        }
    }

我正在将 32 位布尔数组转换为 4 字节的 unsigned char 类型。 seg_byte 这里可能是 '\0',但即使我将 seg_byte 替换为 'a',或者使用 header.reserve(8) 并使用 push_back 而不是数组索引,我仍然会遇到分段错误。我也尝试过使用vector&lt;char&gt; 并转换为char,但仍然出现分段错误。 cout 语句打印此内容。

byte_num minus one is 0
vector size 8
byte_num minus one is 1
vector size 139991841770280
Segmentation fault

如果我编写一个小的 test.cpp 文件,它只运行一个填充 vector&lt;unsigned char&gt; 的 for 循环,我不会收到任何错误。

【问题讨论】:

  • bool_byte[i] = snb[i];i 大于 7 时,这行会发生什么? (因为你的循环转到 31)
  • 非常感谢,愚蠢的错误

标签: c++ linux vector segmentation-fault


【解决方案1】:

在一段在 MacOS 和 Ubuntu 上运行良好的代码中出现分段错误

如果您使用Address Sanitizer 构建程序(您应该养成一直这样做的习惯),它会立即告诉您有关缓冲区溢出的信息.

使用 Address Sanitizer 构建非常简单:

g++ -fsanitize=address -g test.cpp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多