Этот ответ предполагает, что 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)
, которое может во много раз превышать длину массива.