2015-11-23 2 views
0

PART1С ++: ошибка Сегмент 11 после выполнения "push_back"

typedef long long ll; 
struct forloop { 
    char val, lim; 
    int dep; 
}; 
vector<forloop> loop; 

PART2

int main() { 

//read 
memset(tp, 0, sizeof tp); 
loop.clear(); 
string str; 
while (getline(cin, str)) { 
    int st = 0; 
    while (str[st] <= 32) st ++; 
    while (!loop.empty() && loop.back().dep >= st/4) loop.pop_back(); 
    if (str[st] == 'f') { //for loop 
     char val, lim; 
     string tmp = str.substr(st, 20); 
     sscanf(tmp.c_str(), "for %c in range(%c):", &val, &lim); 
     **loop.push_back((forloop){val,lim,st/4});** 
    }else { //lag 
     doit(); 
    } 
} 
out(); 
return 0; 
} 

После того, как "loop.push_back ((forloop) {вал, Пт, ул/4});" У меня возникла ошибка сегментации: 11

Кто-нибудь знает почему? Спасибо!

+0

'forloop' и' loop' не являются хорошими именами для типов или структур данных. Он не говорит мне, что они представляют. 'memset' может быть источником ошибок, но я не знаю, что это за' tp' вы его используете. 'sscanf' также может быть источником ошибок. Можете ли вы использовать потоки C++? Вы также должны учитывать, что должно произойти, если 'str' не содержит символов' st'. Это может быть даже пусто. –

+1

Лучше всего идти по строкам через отладчик. Неясно, что вы пытаетесь сделать, какой ввод вы предоставляете. Я бы посмотрел на переменную 'st'. –

+0

@AnonMail Да, я выполнил отладку по строке и обнаружил, что он разбился, когда он выполнял «push_back». Спасибо, в любом случае! –

ответ

0

Если вызов push_back вызывает проблему, вы можете потерять память, потому что вы отбросили слишком много элементов. Подсчитайте количество элементов в векторе, чтобы увидеть, что вы случайно не создали слишком много.

Мне интересно, что вы имели в виду под словами «после» в своем комментарии в конце. Вы имеете в виду, что это может происходить в функции doit()?

Смежные вопросы