Что произойдет, если мой указатель пересечет границы массива?
Я создал код ниже, где мне нужно отслеживать массив, увеличивать указатель на массив и останавливаться, если массив заканчивается.
Я тестировал с использованием кода ниже и, по-видимому, после 1000 итераций увеличения ptr
и печати *ptr
, я получаю 0
как значение.
Так верно ли, что последний элемент массива ВСЕГДА будет 0? Как я могу сказать, что ptr останавливается на последнем элементе, если длина массива создается динамически (и мне не разрешено использовать только связанный список)? Я боюсь, что если я буду использовать ниже код, однажды я встречу printf я = 1000, и он вернет мне случайную ячейку памяти (sofar для кода ниже, это неверно, но кто знает).
#include <stdio.h>
int my_array[] = {1,23,17,4,-5,100};
int *ptr;
int main(void)
{
int i;
ptr = &my_array[0]; /* point our pointer to the first
element of the array */
printf("value of ptr is %d\n", *ptr);
for(i=0; i<1000; i++){
ptr++;
}
printf("value of ptr is now %d", *ptr);
return 0;
}
Ответы
Ответ 1
Итак, это правда, последний элемент массива ВСЕГДА будет "0"?
Нет, это просто удача. Вы читаете из случайного местоположения в своей памяти, вы даже можете оказаться в ошибке сегментации, убивая вашу программу.
Вы всегда должны быть уверены, что не читаете/не пишете границы вашего массива, или действительно могут быть плохие вещи (ошибки сегментации могут быть наименее плохими).
Вы можете отслеживать количество элементов в массиве, используя: sizeof(my_array)/sizeof(int)
Ответ 2
Нет, вам не разрешается разыгрывать элемент за концом вашего массива; это поведение undefined.
Один из способов сделать это - отметить, что в вашем массиве есть элементы sizeof(my_array)/sizeof(my_array[0])
.
Ответ 3
Итак, это правда, последний элемент массива ВСЕГДА будет "0"?
Нет, вам не повезло, что код не сломался.
Как я могу сказать, что ptr останавливается на последнем элементе, если длина массива создается динамически
Невозможно с массивами. Вам нужно знать размер массива и перебирать его.
Ответ 4
Вам нужно отслеживать размеры динамических массивов самостоятельно, передавая дополнительные аргументы. Нет никакой гарантии о памяти после массива.
0 завершение предоставляется только для строк.
Ответ 5
Я не буду зависеть от того, что после вашего массива 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++)
Мой С++ немного ржавый, но должен сделать трюк:)
Ответ 6
вы должны сами контролировать размер массива
sizeof(my_array)/sizeof(int)
вы создали массив с 6 элементами. путем обращения к 7-му элементу (array[6]
) массива, вы запускаете программу