Динамический Массив. Размер игнорируется. C ++

0

Я новичок в C++. Я пытаюсь понять Управление памятью в C++, а также работать с указателями. У меня вопрос о динамическом массиве.

//This is the part of my code:
int *ptr;
ptr = new int[3];
ptr[0] = 1;
ptr[1] = 2;
ptr[2] = 3;
// Normally I would think I cannot add further elements to the array, but it is possible
ptr[3] = 4;
ptr[4] = 5; 
ptr[5] = ...

Итак, мой вопрос в том, почему я могу добавить дополнительные элементы в массив, когда я инициализировал размер массива с размером = 3?

С одной стороны, имеет смысл, что мой массив может расти "динамически". С другой стороны, это не имеет смысла из-за этой строки:

ptr = new int[3];
  • 2
    Вы вызываете неопределенное поведение.
  • 0
    Чтобы ответить на вопрос «почему», C / C ++ не ограничивает проверку массивов. Они верят в то, что позволят вам застрелить себя в труднодоступных местах. Наслаждайтесь!
Теги:
arrays
pointers
dynamic
size

3 ответа

2
Лучший ответ

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

Доступ к элементу массива - это просто доступ к сдвинутому указателю на первый элемент:

int *ptr;
ptr = new int[3]; // This code allocates 12 bytes, say 0x12340000 - 0x1234000B. ptr = 0x12340000 (note 4 bytes for each integer)
ptr[2] = 5; // This code sets integer at 0x12340000+2*sizeof(int) = 0x12340008
ptr[3] = 6; // This code sets an "integer" at 0x12340000+3*sizeof(int) = 0x1234000C - which is outside your array
ptr[10000000] = 7; // This or something like this will crash your program

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

Общий совет: вы не можете добавлять элементы в массив, если вам нужно изменить размер коллекции позже - используйте вектор

  • 0
    s / lucky / unlucky / - в таких случаях сбой - это хорошая вещь; это позволяет вам знать, что есть проблема. Что было бы плохо, если бы он не вылетал, а оставлял вашу программу в плохом состоянии.
1

Я бы предложил использовать вектор вместо массива.

1

Превышение границ массива - это неопределенное поведение. Вот почему.

В этом случае вам повезло получить результат. Но неопределенное поведение означает, что программа может взорвать ваш компьютер в следующий раз;)

Поэтому не делайте этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню