2015-12-16 2 views
-2

У меня есть проблемавыделить указатель с целыми числами

struct bin 
{ 
    int *vector; 
    bin *next; 
}; 

bin *v = new bin; 

и в функции у меня есть:

v->vector = new int[3]; 
// etc. 

Идея заключается в том, что: если я ставлю v->vector[20] = 3; это работает, и я не знаю почему, потому что я ожидал ошибки. Я думаю, что я не очень разбираюсь в том, что делает v->vector = new int[1];. Я думал, что выделено 3 int для вектора: v->vector[1],v->vector[2],v->vector[3]. Может кто-нибудь объяснить мне, почему v->vector[20]=3; не дает мне ошибку? Thanks

+1

Это C++, а не C! Не используйте не связанные теги. – Olaf

ответ

-2

Я предполагаю, что вы запускаете свое приложение на ОС высокого уровня (Windows, Linux)? По умолчанию ваш процесс будет отображать определенное количество физической памяти.

Когда вы сделали выделение для vector[], система выделяет память из памяти, отображаемой по умолчанию физической памятью (оптимизация производительности).

Когда вы начнете движение через вектор [], то до тех пор, пока вы находитесь в пределах действительного адреса памяти, ваша программа не будет аварийно завершена.

Если вы попытаетесь прочитать/записать вектор [33776], то, скорее всего, ваша программа выйдет из строя (, скорее всего,, так как поведение при доступе к неориентированной памяти не определено).

2

Это не работает. Это дает «неопределенное поведение» - вы написали в память, которую не должны иметь. У C++ нет проверки границ массива, если вам это нужно, вам придется сделать это самостоятельно, возможно, добавив размер в структуру?

struct bin 
{ 
    int *vector; 
    int vectorSize; 
    bin*next; 
}; 

Кроме того, C++ индексы массивов от 0, а не 1, так что элементы, которые вы можете получить доступ через: v->vector[0], v->vector[1] и v->vector[2]

Последнее, но не в последнюю очередь, называя его vector, когда уже очень распространенный векторный класс C++ может быть немного запутанным. Вы всегда можете заглянуть в существующий класс stl::vector, который может делать все, что вам нужно.