Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
9 / 9 / 2
Регистрация: 11.08.2011
Сообщений: 66
1

Указатель на середину массива в free()

13.02.2012, 19:30. Показов 2549. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Допустим есть некоторый код:

C
1
2
3
4
5
6
7
8
9
10
11
12
...
    int n,*a,*i,*j;
    scanf("%d",&n);
    a=(int*)malloc(sizeof(int)*n);
    for (i=a;i<a+n;i++) scanf("%d",i);
        for (i=a;i<a+n;){
        if ((*i)&4){
            for (j=i;j<a+n-1;j++) *j=*(j+1);
            free(a+(--n));
        }else i++;
    }
...
Можно ли ТАК использовать free в строке 9 (передавать указатель на середину массива) и что в данном случае происходит?

Могу сразу сказать, что к ошибке компиляции или выполнения это не приводит.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2012, 19:30
Ответы с готовыми решениями:

Вставить число 0 в середину на k место, сделать через указатель
Вставить число 0 в середину на k место (0&lt;=k&lt;=10) массива М (20), сдвинув вправо значения элементов...

Почему указатель невалиден, и программа вылетает на free()?
Есть некая функция typedef struct player_t { char* name; char* nickname; Instrument*...

Найти среднее арифметическое элементов массива и включить найденное значение в середину массива
Здравствуйте! Помогите, пожалуйста, решить информатику а то отчислят из универа. С VBA вообще...

Втсавить число 0 в середину массива М (20), предварительно сдвинув вправо значения элементов массива, начиная с 11
Помогите сделать программу с применением массива в С++. Условие: Втсавить число 0 в середину...

7
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
13.02.2012, 21:13 2
Цитата Сообщение от Preveter Посмотреть сообщение
Могу сразу сказать, что к ошибке компиляции или выполнения это не приводит.
Память выделяется и освобождается целыми кусками, нельзя убрать лишь часть(разве что с помощью realloc, но и это только в конце блока). Поведение при попытке освободить не выделенный блок не определено, но работать как надо точно не будет.
1
9 / 9 / 2
Регистрация: 11.08.2011
Сообщений: 66
13.02.2012, 21:15  [ТС] 3
Цитата Сообщение от NoMasters Посмотреть сообщение
нельзя убрать лишь часть(разве что с помощью realloc, но и это только в конце блока
Но что тогда происходит в моем случае? Ничего? Или же что-то все-таки освобождается?
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
13.02.2012, 21:20 4
Происходит неопределенное поведение же) По идее ничего освобождаться не может.
2
9 / 9 / 2
Регистрация: 11.08.2011
Сообщений: 66
13.02.2012, 21:24  [ТС] 5
Учту. А как пользоваться realloc для уменьшения количества выделенной памяти?
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.02.2012, 21:28 6
Цитата Сообщение от Preveter Посмотреть сообщение
А как пользоваться realloc
>man realloc

Добавлено через 21 секунду
или гугла спроси.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
13.02.2012, 21:29 7
Preveter, задавать количество элементов меньше текущего, последние элементы просто отбрасываются.
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
13.02.2012, 21:32 8
Но имейте ввиду, что если вы делаете realloc asciiz-строки, то рискуете отбросить нуль-терминатор. По-этому после такого realloc имеет смысл выставлять последний байт новой строки в ноль.
0
13.02.2012, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2012, 21:32
Помогаю со студенческими работами здесь

Приведение любого двумерного массива к типу указатель на указатель
Допустим, есть несколько массивов int arr1; int arr2; int arr3; Какое преобразование нужно...

Указатель на константную строку и имя массива как указатель
Изучаю C. У меня есть указатель на константную строку, и я хочу его изменить путем передачи в...

Указатель на указатель массива для передачи в функцию/цикл
При написании программы в универе, столкнулся с проблемой короткого описания массива в цикле и в...

Найти последний элемент массива R[K], величина которого находится в заданном диапазоне [a, b]; переставить его в середину массива
Найти последний элемент массива R, величина которого находится в заданном диапазоне ; переставить...

Вставить элемент в середину массива
Здравствуйте! Подскажите, пожалуйста, как вставить элемент в середину массива (не заменить один на...

Добавить элемент в середину массива
Всем доброго времени суток. Есть задание: В целочисленном массиве X(N) после каждого...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru