Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Preveter
9 / 9 / 2
Регистрация: 11.08.2011
Сообщений: 66
1

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

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

Допустим есть некоторый код:

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2012, 19:30
Ответы с готовыми решениями:

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

Вставить число 0 в середину массива
Буду очень благодарен если поможете исправить коды : 1 Задача : Вставить...

Вставить число 0 в середину массива
Вставить число 0 в середину массива M(20), предварительно сдвинув вправо...

Бинарный поиск: Найти правую и левую границы массива, а так же его середину
Здравствуйте. Подскажите пожалуйста как найти правую и левую границы массива, а...

Указатель на элемент массива
Задание: написать программу, выделив под массив динамически память. Обращаться...

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

Добавлено через 21 секунду
или гугла спроси.
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
13.02.2012, 21:29 7
Preveter, задавать количество элементов меньше текущего, последние элементы просто отбрасываются.
0
talis
793 / 545 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
13.02.2012, 21:32 8
Но имейте ввиду, что если вы делаете realloc asciiz-строки, то рискуете отбросить нуль-терминатор. По-этому после такого realloc имеет смысл выставлять последний байт новой строки в ноль.
0
13.02.2012, 21:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 21:32

Указатель на нулевой элемент массива
char *UpToLow(char *str) { char *p; while(*str) {...

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

Количество элементов массива через указатель
Привет, подскажите пожалуйста. Неужели нет способа узнать количество выделенных...


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

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

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