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