2014-11-28 3 views
-6

У меня есть простая программа, которая объявляет целочисленный массив, размер для него, выделяет для него память на основе размера, инициализирует элементы и затем выводит каждый инициализированный элемент в массиве. Однако выход не является тем, что я ожидаю, и я не могу найти никакой документации, чтобы объяснить это. Я пост код и выход ниже:Array имеет больше значений, чем ожидалось

#include <iostream> 

void main(int argc, char **argv) 
{ 
    int* a; 
    int size = 4; 

    a = new int[size]; 

    for(int i = 0; i < size; i++) 
    { 
     a[i] = i + 1; 
    } 

    for(int i = 0; ; i++) 
    { 
     if(a[i]) 
     { 
      std::cout << "a[" << i << "] = " << a[i] << std::endl; 
     } 
     else 
     { 
      break; 
     } 
    } 

    system("PAUSE"); 
} 
  • Выход:
  • а [0] = 1
  • а [1] = 2
  • а [2] = 3
  • а [3] = 4
  • а [4] = -33686019
  • а [5] = -1414812757
  • а [6] = -1414 812757
  • а [7] = -17891602
+0

Указатель a не инициализирован правильно, что приводит к неопределенному поведению. Недавно выделенная память для указателя a не освобождена. Для утверждения нужно также исправить. Множество ошибок, которые необходимо устранить. –

+0

Я объявил свой указатель a, позже определил его как новый массив размером 4 (воспользовавшись C++ 11, я считаю) и задал значения для ожидаемых элементов. Я понимаю, что я не удалял, что было просто лень с моей стороны. Если вы можете объяснить свои аргументы в пользу того, почему вы считаете, что инициализировано неправильно, я был бы признателен. – Aaron

+0

Не инициализирующий указатель a правильно предоставит вам неинициализированный указатель/дикий указатель с неопределенным поведением или ошибкой ошибки сегментации. Решение: инициализировать указатель a до нуля или 0 перед распределением новой памяти. https://en.wikipedia.org/wiki/Segmentation_fault –

ответ

0
for(int i = 0; ; i++) 

Когда заканчивается ваш цикл?!?!? Ваше второе условие в for (тестовое выражение) оценивается как true (по крайней мере, до i<4). Вам нужно

for(int i = 0; i < 4 ; i++) 

В противном случае он может сломаться в любое время после i>=4, но не раньше, так как все компоненты a являются не равен нулю для i<4 (a[i] = i + 1;), и после того, как i==4 вы Неопределенное поведение, как вы не выделить достаточно памяти для a.

Также main должен вернуть int согласно стандарту C++.

PS: Для подавляющего большинства простых примеров в большинстве случаев вам даже не нужен отладчик, просто имитируйте в голове или на листе бумаги, что делает программа, по очереди, и вы поймаете ошибку.

+0

Я просто запустил цикл, пока у него не возникнет проблема с массивом, поэтому он прерывается из цикла, когда это происходит. – Aaron

+0

В ответ на ваше редактирование второй цикл цикла повторяется 9 раз перед выходом из цикла и продолжается до системы («ПАУЗА»). Кроме того, my main() - это тип void, который разрешен в консольном приложении Win32. – Aaron

+0

@ Аарон разрешен Microsoft. Microsoft не является автором стандарта C++. Если вы хотите, чтобы ваше программное обеспечение было портативным, пожалуйста, будьте стандартным. А ваш цикл петли 9 раз, потому что после 8-го элемента память содержит 0 в этой точке. Это, однако, неопределенное поведение, и я готов поспорить, что на другой платформе/компьютере ваша петля будет работать более или менее 9 раз. – vsoftco

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