“运行时错误:将无符号偏移量添加到 0x129000a0 溢出到 0x12900088”

问题描述 投票:0回答:2

这是我的代码。

#include <iostream>
#include <vector>
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<string> v;

    for(int i=0; i<n; i++)
    {
        string temp;
        cin>>temp;
        v.push_back(temp);

        //if(v.size() == 1)
        //{
        //    continue;
        //}

        //cout << i << endl;
        //cout << endl;

        //cout << v.size();

        int k = i;
        while(v[k-1].length() > v[k].length() && k>-1)
        {
            swap(v[k], v[k-1]);

            k--;
        }
        //cout << endl;
    }

    bool check = true;
    for(int i=0; i<v.size()-1; i++)
    {
        //cout << v[i] << endl;
        //cout << v[i+1] << endl;

        if (v[i+1].find(v[i]) != std::string::npos)
        {
            //std::cout << "found!" << '\n';
            continue;
        }

        //cout << "false" << endl;
        check = false;
    }

    if(check == true)
    {
        cout << "YES" << endl;
        for(int i=0; i<n; i++)
        {
            cout << v[i] << endl;
        }
    }
    else
    {
        cout << "NO" << endl;
    }
}

这个错误的原因是什么?

输入是:

100
npugmvzdgfnzyxuyfwbzwktiylhvhwgeqauolidpnbemhgbunpefzsltewkxdcrzxgvmkb
bezfumiguzafxghvcfqmwpopxvazctlftelveayycypjckooxeehyk
ingenqhogs
elhnhxjwrytbmmqdwwrivvljybhnwfgwhvdgjqgqgvunuemdtrgpyvaanovheqbupamzrjxh
rpvktlmyxfshahfgunrhuqtosysymfjruqlzdooauuihtchzqgyrhcoxbtoorkxkwakvdkiakitlqfbgz
tnrnpghjmqumbzfnztiijgwkiygyfevfebuammkwnoinqvhhlsuoqtfkazqhlnuqtthudhhovjqiuykwqtck
mloehzniuwyakgwmopfgknpoiuiyewijmoefjjjsdimkisugehwqefcx
tthmaxtahimxxts
fspoetalxgcgowhjtanerjpqnen
hefsyokneekdgpbicss

它适用于其他情况。

诊断检测到问题 [cpp.clang++-diagnose]:C:\Program Files (x86)\Microsoft Visual Studio�7\Enterprise\VC\Tools\MSVC .11.25503\include ector:1802:11:运行时错误:添加未签名0x129000a0 的偏移量溢出到 0x12900088

摘要:UndefinedBehaviorSanitizer:未定义行为 C:\Program Files (x86)\Microsoft Visual Studio�7\Enterprise\VC\Tools\MSVC .11.25503\include ector:1802:11 in

c++
2个回答
37
投票

此错误的原因是什么:

您将

i
设置为
0

int i=0;

然后将

k
设置为
0

int k=i;

然后使用

k-1
来索引
std::vector<std::string> v

while(v[k-1].length()

k-1
-1
,但情况会变得更糟。
std::vector::operator[]
将参数转换为
unsigned
类型,产生一个 难以置信的巨大、根本无效的索引

不使用

std::vector::operator[]
执行边界检查,最终会将不属于你的内存视为有效构造的
std::string


0
投票

谢谢兄弟,你太有帮助了…… 但这不是针对具有类似情况的其他问题提出的问题...

© www.soinside.com 2019 - 2024. All rights reserved.