Итерация массива C ++ - PullRequest
       0

Итерация массива C ++

1 голос
/ 09 июля 2011

Может кто-нибудь определить причину, по которой на консоль ничего не выводится с использованием кода ниже C ++;

string array[] = { "a", "b", "c", "d" };

int length = sizeof(array);
try
{
    for (int i = 0; i < length; i++)
    {
        if (array[i] != "") cout << array[i];
    }
}
catch (exception &e)
{
    e.what();
}

Ответы [ 3 ]

6 голосов
/ 09 июля 2011

Вы используете неправильную длину:

int length = sizeof(array)/sizeof(array[0])

Фактическая причина, по которой вы ничего не видите на консоли, заключается в том, что вывод буферизуется, а поскольку вы не написали символ новой строки, он не очищается.Тем временем ваше приложение вылетает.

1 голос
/ 09 июля 2011

Этот ответ предполагает, что string == std::string.

пусть T - произвольный тип, а n - произвольное натуральное число, тогда:

sizeof(T[n]) == n * sizeof(T)

То есть - sizeof(array) - это не длина массива, а общий объем памяти, используемой массивом (в char с). Ваша реализация std::string вполне может использовать память более чем 1 char для хранения своей структуры. Это приводит к тому, что length будет иметь значение, намного превышающее 4.

Это заставляет программу читать из конца array; операция, для которой C ++ не предъявляет никаких требований (это неопределенное поведение).

С точки зрения абстрактной машины C ++, программа, содержащая неопределенное поведение, может делать абсолютно все, даже до того момента, когда выполняется программа, на которой было обнаружено неопределенное поведение . В вашем конкретном случае ваша программа демонстрирует такое поведение, не печатая ничего (даже если вы сделали 4 четко определенных вызова operator<< до ошибочной индексации массива).

Вы отметили это eclipse-cdt, поэтому я предполагаю, что вы используете GCC для компиляции своей программы и запускаете ее в современной операционной системе с защитой памяти. В этом случае действительная причина поведения, которое вы видите, заключается в том, что std::cout буферизует первые несколько строк, которые вы в него передаете, и поэтому не сразу выводит их на консоль. После этого вы попадаете в переполнение буфера, и ваша операционная система прерывает процесс сигналом EXC_BAD_ACCESS или аналогичным. Это вызывает немедленное завершение вашей программы, что не дает std :: cout возможности сбрасывать свои буферизованные значения. Все это означает, что ничего не печатается.

Как уже упоминалось в другом ответе, вы должны заменить строку:

length = sizeof(array);

с:

length = sizeof(array)/sizeof(array[0]);

Это гарантирует, что length будет содержать значение 4, а не значение 4 * sizeof(string), которое может во много раз превышать длину массива.

1 голос
/ 09 июля 2011

Нет символа конца строки.

Также, как упоминал Дэйв, sizeof не является длиной массива

...