|
автор: in_mysql (08.01.2007 в 16:51) |
|
| Как можно динамически увеличить размер массива, допустим объявляем массив из 10 элементов int
Допустим, потребовалось увеличить его размер ещё на 20 элементов, как это сделать? | |
|
|
|
|
|
|
|
для: in_mysql
(08.01.2007 в 16:51)
| | Никак. Надо юзать STL, шаблон list или vector. | |
|
|
|
|
|
|
|
для: in_mysql
(08.01.2007 в 16:51)
| | void main(void)
{
int * prt = new int[10];
int * pTmp = new int[20];
for(int i = 0; i < 10; i++)
{
pTmp[i] = prt[i];
}
delete[] prt;
prt = pTmp;
} |
| |
|
|
|
|
|
|
|
для: in_mysql
(08.01.2007 в 16:51)
| | Конструкция массива гарантирует, что его элементы располагаются друг подле друга, чтобы можно было передвигаться вдоль массива при помощи указателя. Когда вы объявляется массив из 10 элементов int для него подыскивается соответствующий кусок свободной памяти. Однако это не факт, что вслед за ним будут свободный кусок, чтобы к нему можно было добавить ещё элементов. Поэтому процедура увеличения объёма массива заключается в выделении нового объёма памяти равного конечному объёму массива, копированию туда старых элементов и уничтожению старого объёма памяти (STL по отношению к векторам, кстати, действует точно также) - пример приведён в посте Евгения Петрова. Это достаточно дорогостоящая операция (вообще выделение и освобождение памяти всегда дорого обходится), поэтому если приращение памяти производится часто, лучше прибегнуть к другим конструкциям, например, двухсвязному списку - его элементы могут находиться в памяти где попало, так как связаны друг с другом указателями. | |
|
|
|
|
|
|
|
для: cheops
(08.01.2007 в 23:36)
| | Или как вариант можно резервировать заранее чуть больше памяти чем нужно. А потом просто убрать лишку... Это иногда удобно, когда нужен доступ по индексу. Обращение к элементу массива происходит быстрее чем к элементу списка, т.к. в списке переход осуществляется через краевые элементы путем перехода по указателям. | |
|
|
|
|
|
|
|
для: cheops
(08.01.2007 в 23:36)
| | Кстати а можно ли проверить свободен ли участок памяти после массива? | |
|
|
|
|
|
|
|
для: Евгений Петров
(08.01.2007 в 23:40)
| | В рамках языка (т.е. переносимо на разные платформы) нет, да и так затрудняюсь с ответом... лучше распределение памяти отдавать на откуп системы - и без этого проблем хватает :))) | |
|
|
|
|
|
|
|
для: Евгений Петров
(08.01.2007 в 23:40)
| | вообще правильно сказано было .. да и практика показывает что так выгоднее(по времени и надёжности) отдавать работу с памятью операционке ...
а за массивом посмотреть память нельзя, можно только за конкретным элементом массива :) (например за последним) только иногда это может привести к ошибке :) ... при доступе к памяти(тут поможет тока механизм исключений)
int a[10];
а вот вам и содержимое байта за последним элементом:
cout << *(&a[9] +1);
сам адрес вот:
cout << &a[9]+1;
это моё мнение .. может и не так .. :) | |
|
|
|
|
автор: in_mysql (09.01.2007 в 14:27) |
|
|
для: in_mysql
(08.01.2007 в 16:51)
| | Всем спасибо! | |
|
|
|
|
|
|
|
для: in_mysql
(09.01.2007 в 14:27)
| | да пожалуйста :) | |
|
|
|
|
автор: dezziness (21.01.2007 в 18:30) |
|
|
для: in_mysql
(08.01.2007 в 16:51)
| | int *prt = new int[10];
delete [ ] prt;
prt= new int [30]; | |
|
|
|
|
|
|
|
для: dezziness
(21.01.2007 в 18:30)
| | Только при таком подходе следует учитывать, что ранее записанные в массив int[10] данные удаляются, при выполнении оператора delete [] и массив int[30] будет чист. | |
|
|
|