2016-01-26 7 views
0

В конце программы мой массив печатает правильно, а затем программа segfaults. Зачем?Программа выполняется правильно, затем segfaults

#include <iostream> 
#include <stdio.h> 
#include <iomanip> 
#include <string.h> 
using namespace std; 

int main(int argc, char *argv[]) { 

    FILE *file = fopen(argv[1], "r"); 
    struct item{ 
    char type[9]; 
    int price; 
    bool wanted; 
    }; 
    item items[20]; char temp[8]; 
    for (char i = 0; i < 100; i++) 
    { 
    if (fscanf(file, 
     "%[^,], %[^,], %d", 
     items[i].type, 
     temp, 
     &items[i].price) != 3) 
     break; 
    else if (!strcmp(temp, "for sale")) 
     items[i].wanted = false; 
    else if (!strcmp(temp, "wanted")) 
     items[i].wanted = true; 
    else 
     cout << "aaaagghghghghhhh!!!" << endl; 
    } 

    for (char i = 0; i < 100; i++) 
    { 
    cout << items[i].type << endl; 
    cout << items[i].price << endl; 
    cout << items[i].wanted << endl; 
    } 

} 

ответ

5

Ваш массив объявлен только с 20 пробелами, но ваш цикл равен 100. Возможно, ваш массив будет иметь 100 пробелов.

Использование

item items[100]; 

Переполненных массивов приводит к неопределенному поведению. Возможно, ваш код был записан в память, требуемый во время выполнения C++ во время разворачивания стека программ и т. Д.

+0

OH MY GOSH У меня было это для отладки и забыл изменить его! Agghghgh! Это моя первая программа на C++, полученная с фона Haskell/Python, где IT РАССКАЗИТ ВАС, ЕСЛИ ВЫ ВЫХОДИТЕ ИЗ БОЛОНОВ, так жаль. Почему это вызывает segfault tho? Разве он не должен просто перезаписывать все, что прошло мимо отметки 20? –

+0

@ RenéG Переполнение массивов приводит к неопределенному поведению. См. Мой ответ: я его отредактировал. –

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