Что произойдет, если мой указатель пересекает границы массива? - PullRequest
2 голосов
/ 29 ноября 2011

Я создал приведенный ниже код, в котором мне нужно отслеживать массив, увеличивать указатель на массив и останавливаться, если массив заканчивается.увеличивая ptr и печатая *ptr, я получаю 0 в качестве значения.

Так правда ли, что последний элемент массива ВСЕГДА будет равен 0?Как я могу сказать ptr остановиться на последнем элементе, если длина массива создается динамически (и я не могу вместо этого использовать связанный список)?Я боюсь, что если я буду использовать приведенный ниже код, однажды я встретлю printf i = 1000, и он возвращает мне случайное место в памяти (софар для кода ниже, это не так, но кто знает)*

Ответы [ 6 ]

4 голосов
/ 29 ноября 2011

Итак, верно ли, что последний элемент массива ВСЕГДА будет равен "0"?

Нет, это просто удача.Вы читаете из случайного местоположения в вашей памяти, вы можете даже оказаться в результате ошибки сегментации, убив вашу программу.вашего массива, или могут произойти действительно плохие вещи (ошибки сегментации могут быть наименее плохими). ​​

Вы можете отслеживать количество элементов в вашем массиве, используя: sizeof(my_array)/sizeof(int)

2 голосов
/ 29 ноября 2011

Так верно ли, что последний элемент массива ВСЕГДА будет равен "0"?

Нет, вам не повезло, что код не сломался.

Как мне сказать ptr остановиться на последнем элементе, если длина массива создается динамически

Невозможно с массивами. Вам нужно знать размер массива и перебирать его.

2 голосов
/ 29 ноября 2011

Нет, вам не разрешено разыменовывать элемент после конца вашего массива; это неопределенное поведение.

Один из способов сделать это - отметить, что в вашем массиве есть sizeof(my_array)/sizeof(my_array[0]) элементов.

1 голос
/ 29 ноября 2011

Я бы не зависел от того факта, что после вашего массива 0, поскольку управление памятью меняется с платформы на платформу.

Поскольку вы объявляете массив, вы должны знать, как долго он находится, поэтому технически можно сказать:

for(i = 0; i < 6; i++)

Если вы не знаете размер массива, вы всегда можете использовать оператор sizeof следующим образом:

// (sizeof my_array) will return the total size of the array in bytes
// (sizeof my_array[0]) will return the size of one element in bytes
// Dividing the two sizes in bytes will give you the total size.

int array_size = (sizeof my_array) / (sizeof my_array[0]); 
for(i = 0; i < array_size; i++)

Мой C ++ немного ржавый, но с этим надо справиться:)

1 голос
/ 29 ноября 2011

Вам необходимо самостоятельно отслеживать размеры динамических массивов, передавая дополнительные аргументы. Нет никаких гарантий относительно памяти после массива.

0 прекращение предоставляется только для строк.

0 голосов
/ 29 ноября 2011

Вы должны сами контролировать размер массива

sizeof(my_array)/sizeof(int)

вы создали массив из 6 элементов. доступ к 7-му элементу (array[6]) массива приводит к аварийному завершению программы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...