С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

как освободить только первый элемент массива, не трогая остальные? - C++

09.06.2012, 21:26. Просмотров 1259. Ответов 20
Метки нет (Все метки)

Есть код:

C
1
2
int *ptr;
ptr = (int*)calloc(10, sizeof(int));
собственно вопрос: как освободить только первый элемент массива? не трогая остальные
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2012, 21:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как освободить только первый элемент массива, не трогая остальные? (C++):

Первый элемент массива равен 1 а остальные почему-то нулю - C++
Здраствуйте есть вопрос к задаче: дана программу реализовывающую вычисление последовательности Фиббоначи до определённого номера...

Выводит только первый элемент массива символов - C++
Потом вместо каждого символа выводит что-то вроде |for (int i = 0; i < 100; i++) { printf("%c\n", fault); }

Выводится в файл только первый символ строки, остальные пустые - C++
Есть код обработчика нажатия.По идее,ставя точки останова и проверяя значения все значения получаются правильно.Но при выводе в файл эти 5...

Создать два новых массива: в первый перенести все цифры из исходного массива, во второй - все остальные символы - C++
Задан массив из k символов.Создать два новых массива: в первый перенести все цифры из исходного массива, во второй - все остальные символы....

Как проверить первый элемент двумерного массива на 0? - C++
Всем привет. Дана функция ввода элементов двумерного массива. Необходимо вставить условие: если первый элемент массива равен 0, то...

Сформировать два массива из исходного: в первый записать отрицательные элементы, во второй – остальные - C++
Сформировать два новых массива из одномерного K: в первый записать отрицательные эле- менты исходного массива, во второй – все остальные....

20
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 21:36 #2
В Си - никак. В Си++ подозреваю, можно использовать delete, вместо delete []. Не проверял.

Добавлено через 2 минуты
Впрочем, если используется динамическая структура, где каждый отдельный элемент имеет свой кусок памяти - то... Ну, в общем, понятно. Деревья, списки и прочее поддаются гуглению.
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,154
Записей в блоге: 17
09.06.2012, 21:38 #3
как освободить только первый элемент массива? не трогая остальные
Так просто не делают... если и освобождают так весь массив....
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 21:41  [ТС] #4
AnyOne697, new\delete не умеют довыделять память.

хорошо, а насколько корректна следующая запись?

C
1
2
3
4
5
6
7
int *ptr, *ptr2;
        ptr = (int*)calloc(10, 4);
        for(int i=0; i<10; ++i) ptr[i] = i;
        ptr2 = ptr;
        ptr += 9;
        free(ptr);
        ptr = ptr2;
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 21:51 #5
Хм... Не корректна. Вообще. http://codepad.org/zhxvKdfH (смысл тот же).
0
MikeSoft
Эксперт С++
3802 / 1778 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
09.06.2012, 21:58 #6
Цитата Сообщение от Ksan Посмотреть сообщение
AnyOne697, new\delete не умеют довыделять память.
А написать функцию, возвращающую указатель на "нововыделенную" область памяти (с новым указанным размером) разве не сможете?

Вам правильно советуют:
Цитата Сообщение от AnyOne697 Посмотреть сообщение
В Си - никак. В Си++ подозреваю, можно использовать delete, вместо delete [].
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 22:01  [ТС] #7
Цитата Сообщение от MikeSoft Посмотреть сообщение
А написать функцию, возвращающую указатель на "нововыделенную" область памяти (с новым указанным размером) разве не сможете?
Не совсем понял, что вы имеете ввиду под этим?
Мне 2мя указателями оперировать что ли?
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
09.06.2012, 22:08 #8
Цитата Сообщение от MikeSoft Посмотреть сообщение
Вам правильно советуют:
А как потом доудалить оставшуюся?

Топикстартер, C плохо работает с массивами. Если нужен именно он, то либо realloc, что адски медленно, либо сделать новый указатель, да. Если память нужно будет удалять, то сохранить оригинальный — удаление по измененному указателю, если я правильно помню, работает некорректно.
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 22:16 #9
Цитата Сообщение от Ksan Посмотреть сообщение
Не совсем понял, что вы имеете ввиду под этим?
Мне 2мя указателями оперировать что ли?
Цитата Сообщение от MikeSoft Посмотреть сообщение
А написать функцию, возвращающую указатель на "нововыделенную" область памяти (с новым указанным размером) разве не сможете?
Примерно так:
C++
1
2
3
4
5
6
char *realloc(char *p, unsigned size){
   char *t = new char[size];
   memset(t, p, size);
   delete [] p;
   return t;
}

Цитата Сообщение от Jtalk Посмотреть сообщение
А как потом доудалить оставшуюся?
Легко. Указатель не обнуляется.
C++
1
2
3
4
5
6
int main(){
   int *a = new int[12];
   delete a++; //была освобождена память для первого элемента
 
   return 0;
}
Впрочем, я не уверен в возможности сего. Когда использовал, утечек не наблюдалось. Но использовал в небольшой программе - просто хотел немного оптимизировать.

Цитата Сообщение от Jtalk Посмотреть сообщение
C плохо работает с массивами
Сложность работы с ними не обуславливает плохую работу. Си просто идеально работает с массивами. Кроме массивов в Си просто ничего нет ;-)
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 22:16  [ТС] #10
Jtalk, realloc медленно работает? вы уверены?
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
09.06.2012, 22:22 #11
Цитата Сообщение от AnyOne697 Посмотреть сообщение

Легко. Указатель не обнуляется.
Код C++1 2 3 4 5 6 int main(){ int *a = new int[12]; delete a++; //была освобождена память для первого элемента return 0; }
Впрочем, я не уверен в возможности сего. Когда использовал, утечек не наблюдалось. Но использовал в небольшой программе - просто хотел немного оптимизировать.
В данном случае память очистит ОС после закрытия приложения. В стандарте C++ (по крайней мере старом) четко было написано, что модифицировать указатель, выданный new[], нельзя, т.к. это вызовет ошибки при использовании delete[]. Соответственно, удалять память "кусками" можно только если приложение маленькое и небольшие утечки не страшны.


Сложность работы с ними не обуславливает плохую работу. Си просто идеально работает с массивами. Кроме массивов в Си просто ничего нет ;-)
структуры, перечисления, объединения, функции, etc.
А как еще обозначить плохую работу? Что угодно можно сделать библиотеками, удобство работы с массивами — это в первую очередь качество их поддержки языком. А C дальше указателей на память массивы никогда не поддерживал.

Добавлено через 1 минуту
Цитата Сообщение от Ksan Посмотреть сообщение
Jtalk, realloc медленно работает? вы уверены?
По сравнению с инкрементом указателя? На порядки. realloc просто выделяет новый кусок памяти и делает memcpy куска старой памяти в новую. Соответственно, замедление зависит от объема выделяемой и копируемой памяти. Насколько я помню, realloc не умеет оптимизировать этот процесс.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
09.06.2012, 22:27  [ТС] #12
Jtalk, я думал, что реаллок выделяет кусок памяти и "клеит" его к старому
0
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
09.06.2012, 22:30 #13
Цитата Сообщение от Ksan Посмотреть сообщение
Jtalk, я думал, что реаллок выделяет кусок памяти и "клеит" его к старому
Сейчас посмотрел, да, он может так делать. Но это не гарантируется. Да и вам надо "отклеить".
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
09.06.2012, 22:43 #14
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Легко. Указатель не обнуляется.
C++
1
2
3
4
5
6
int main(){
   int *a = new int[12];
   delete a++; //была освобождена память для первого элемента
 
   return 0;
}
Такой вопрос:
C++
1
2
3
4
5
6
int main(){
   int *a = new int[12];
   delete a++; //была освобождена память для первого элемента
   delete [] a;
   return 0;
}
Как система узнает, что надо удалить 11 элементов начиная с адреса a?
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
09.06.2012, 22:46 #15
Цитата Сообщение от Chelioss Посмотреть сообщение
Как система узнает, что надо удалить 11 элементов начиная с адреса a?
Она вывалит exception. Так что надо будет в цикле удалять по одному. Ранее уже говорилось, что это чревато утечками. Если программа небольшая (пару сотен килобайт) - ОС сама освободит память после завершения работы.

А вообще, преждевременная оптимизация - корень всех зол.
0
09.06.2012, 22:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2012, 22:46
Привет! Вот еще темы с ответами:

Как удалить из одномерного массива первый отрицательный элемент - C++
Как удалить из одномерного массива первый отрицательный элемент for (i=0; i&lt;SIZE; i++) if (a==0) delete a вот эта...

Как определить первый с конца четный элемент двумерного массива? - C++
двумерный массив. Как определить первый с конца четный элемент двумерного массива? Как написать цикл for с конца в начало.

Дан массив F[0:n-1].Сформировать два новых массива: первый содержит элементы, не превышающие заданного числа, а второй - все остальные - C++
Помогите пожалуйста.Нужен полный текст программы, заранее благодарен

Из положительных элементов массива вычесть первый элемент, из остальных - второй элемент - C++
Дан массив L(7). Из положительных элементов вычесть первый элемент, из остальных - второй элемент. Вывести новый массив на печать.2 3 -4 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.