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

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

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

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

#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;
}

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// (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++ немного ржавый, но с этим надо справиться:)

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

sizeof(my_array)/sizeof(int)

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

Другие вопросы по тегам