2015-05-30 2 views
-1

Я пишу C++ функции для вычисления размера массива C-типа в C++Странное поведение размер массива C++

я заметил, очень странное поведение при использовании этих двух различных кодов:

код 1:

int sz = sizeof array/sizeof *array; 

код 2:

int array_size(const int *pointer) 
{ int count=0; 
    if(pointer) 
     while(*pointer) { 
      count++; 
      pointer++; 
     } 
    return count; 

} 

Когда я применил эти два метода в массиве, он дал мне очень странное поведение:

пример 1:

int array[10] = {31,24,65,32,14,5};// defined to be size 10 but init with size 6 

код один даст мне размер = 10, а код 2 будет дают мне размер 6, и когда я распечатать элемент, на который указывает указатель *, это даст мне правильный элементы массива:

31 24 65 32 14 5 

пример 2

int array[] = {31,24,65,32,14,5}; // no declared size but init with 6 

Код 1 даст мне размер 6, код 2 даст мне размер 12, и когда я распечатать элемент, на который указывает * указатель в коде 2, это дает мне:

31 24 65 32 14 5 -802013403 -150942493 1461458784 32767 -1918962231 32767 

, что действительно не так, так что может быть проблемой, вызывающей такое поведение? и каковы эти цифры?

Спасибо за ваш ответ

+1

@juanchopanza неудачный упор :-P ... –

+1

И почему вы полагаете, что второй метод когда-либо будет работать? – m0nhawk

+0

«Массив типа C» для меня не имеет большого значения.Это как сказать «C-стиль' if' ». – szczurcio

ответ

6

Этот массив имеет 10 элементов, независимо от того, как вы его инициализации:

int array[10] = {31,24,65,32,14,5}; 

Но инициализации устанавливает первые 6 элементов к определенным ценностям, а остальные к 0. Это эквивалентно следующему:

int array[10] = {31,24,65,32,14,5,0,0,0,0}; 

Первый расчет с использованием sizeof использует фактический размер массива FO (его длина раз размером с int), в то время как второй подсчитывает элементы до тех пор, пока не найдет 0. Поэтому он не вычисляет длину массива, а длину первой ненулевой последовательности в массиве.

Обратите внимание, что второй метод работает только в том случае, если массив имеет элемент со значением 0. В противном случае вы выходите за пределы и вызывают неопределенное поведение.

+0

Большое спасибо. Значит ли это, когда размер массива не определен, указатель, указывающий на массив, в конечном итоге выйдет из строя и даст мне странное значение? – Chrim

+0

@Chrim Определяется размер массива. Его длина равна 10. Но указатель - это указатель. Вы не можете получить длину массива от указателя на элемент массива (т. Е. Если 'int *' указывает на элемент 'int [42]', вы не можете получить '42', от указателя.) – juanchopanza

+0

Спасибо, Это действительно полезно. – Chrim

1

код 2 не является правильным. вы не можете принять конец массива с 0

+0

спасибо большое – Chrim

2

array_size предполагает, что есть 0 только за конец массива. Это предположение необоснованно.

+0

спасибо большое – Chrim

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