Программа перестает работать после печати argv

Я написал базовый код

#include <iostream>
using namespace std;

int main( int argc, char *argv[] ){
    for (int i=1;i<=argc;i++){
        cout << argv[i] <<"\n";
    }
    cout <<"hello";

    return 0;
}

и когда я запускаю его, например, с

./a.out 1 2 3

Я понимаю:

1
2
3

Почему нет "привет"?


person zbyshekh    schedule 29.03.2014    source источник
comment
Наверное, потому что ты застенчивый flush.   -  person Rubens    schedule 30.03.2014
comment
заменить i<=argc на i<argc   -  person Iłya Bursov    schedule 30.03.2014
comment
@Rubens: Нет, потоки сбрасываются в конце программы.   -  person Lightness Races in Orbit    schedule 30.03.2014


Ответы (2)


Ваш цикл пытается передать поток argv[argc], который находится на единицу после аргументов вашей программы.

На самом деле, он определяется как нулевой указатель1, а предоставление потокам нулевого указателя устанавливает их бит ошибки2.

Следовательно, ваша следующая потоковая операция (cout << "hello") завершится ошибкой.

Цикл до argc но не включая его:

for (int i = 1; i < argc; i++) {
    cout << argv[i] << '\n';
}

Сноска 1

[C++11: 3.6.1/2]: [..] Значение argv[argc] должно быть 0. [..]

Сноска 2

[C++11: 27.7.3.6.4/3]: Требуется: s не должен быть нулевым указателем.

Когда это так, поведение не определено; GCC решает перехватить условие и установить бит ошибки потока, см. https://stackoverflow.com/a/7019483/560648 .

person Lightness Races in Orbit    schedule 29.03.2014
comment
и, конечно же, argv[0] — это имя исполняемого файла. вот почему первый аргумент находится в не-C-подобном 1. - person Roddy; 30.03.2014
comment
@JohannesSchaub-litb: Ты шутишь? - person Lightness Races in Orbit; 30.03.2014
comment
@LightnessRacesinOrbit нет, определенно нет - person Johannes Schaub - litb; 30.03.2014
comment
@JohannesSchaub-litb: мне жаль это слышать :( - person Lightness Races in Orbit; 30.03.2014

вы ссылаетесь на argv[argc], который находится за пределами массива.

Измените оператор for на:

for (int i=1;i<argc;i++){
person zumalifeguard    schedule 29.03.2014