Что произойдет, если мой указатель пересечет границы массива?

Я создал код ниже, где мне нужно отслеживать массив, увеличивать указатель на массив и останавливаться, если массив заканчивается.

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