94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
1

Функция realloc

15.03.2017, 11:56. Показов 2422. Ответов 4
Метки нет (Все метки)

Есть такой фрагмент кода:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 /* поиск отрицательных элементов и их размещение в конце массива*/
        int k = N - 1, iotr;
        float tmp;
        for( i = N - 1; i >= 0; i-- )
            if( array[i] < 0)
            {
            tmp = array[i];
            for( j = i; j < k ; j++)
                array[j]= array[j+1];
                array[k] = tmp;
                k--;
            }
        for( i = 0; array[i] > 0; i++ ) iotr = i;
        array = realloc( array, sizeof(float)*(iotr+1));
        printf("\n");
        for( i = 0; i <= iotr; i++ )
        printf( "A[%d] = %.2f\t", i, array[i] );
        free( array );
Была выделена динамическая память для массива array, после я решил перераспределить память с помощью функции realloc, отводя память только до последнего положительного элемента. Ну так вот, если я увеличиваю значение iotr, то в массиве пишется либо мусор, либо некоторые старые отрицательные элементы. Так и должно быть? Против мусора я ничего не имею, а вот почему старые пишутся, немножко недоумеваю. Есть подсознательные догадки, что « компилятор сам решает, что записать после выхода за динамический массив », но лучше объясните.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2017, 11:56
Ответы с готовыми решениями:

Не работает функция realloc()
Есть такое задание : Write a program, in which define such functions: - a function that...

Функция realloc возвращает NULL
Написал функцию ins (insert) в качестве тренировки. Сам код работает, но когда добавил динамическое...

Функция realloc отказывается выделять память
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define MAX_WORD_LENGTH 20 #define SMALLEST_CHAR 0...

Realloc
Программа должна забивать массив command_comblock символами 'p', но она почему-то не выполняет...

4
Вездепух
Эксперт CЭксперт С++
10829 / 5848 / 1587
Регистрация: 18.10.2014
Сообщений: 14,504
15.03.2017, 12:00 2
Цитата Сообщение от Michail97 Посмотреть сообщение
Ну так вот,
Ничего не понятно. В чем проблема со "старыми отрицательными элементами"? У вас ведь так и написано - оставить один старый отрицательный элемент после положительных.

Код производит странное впечатление своим форматированием. У вас строки

C
1
2
array[k] = tmp;
k--;
не входят во внутренний цикл. А форматирование как бы намекает, что вы хотели, чтобы они входили. (Хотя скорее всего не должны).
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
15.03.2017, 14:36  [ТС] 3
TheCalligrapher, ну с кодом всё в порядке. И с циклами тоже. Всё, как написано, так я и хотел. Этот алгоритм я придымывал часа 2, просто ещё требовалось, чтобы отр элементы были в своём перв порядке следования. Вложенный цикл копирует элементы, сдвигает влево. При этом последний элемент забит ничем. И на его место ставим отр элемент(уже вышли из цикла). В след просмотре не рассматриваем его, использую постф декрементирование.

Добавлено через 1 час 18 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
У вас ведь так и написано - оставить один старый отрицательный элемент после положительных.
Где такое написано? realloc перераспределяет память только для положительных. В переменной iotr хранится индекс последнего положительного элемента. Но т к массив индексируется с нуля, то кол - во полож элементов iotr + 1.

Добавлено через 2 минуты
TheCalligrapher, да, отступы не стоят, когда вложенный цикл кончается. Тут извините.
0
Вездепух
Эксперт CЭксперт С++
10829 / 5848 / 1587
Регистрация: 18.10.2014
Сообщений: 14,504
15.03.2017, 18:00 4
Цитата Сообщение от Michail97 Посмотреть сообщение
Где такое написано? realloc перераспределяет память только для положительных. В переменной iotr хранится индекс последнего положительного элемента. Но т к массив индексируется с нуля, то кол - во полож элементов iotr + 1.
Да, верно. Я был не прав - не заметил, что iotr - это последний индекс. Но тогда в чем проблема? Попробовал запустить ваш код - все работает, как и ожидается. Никаких лишних элементов после realloc не выводится.

(Разумеется, некрасиво получается, если положительных элементов вообще нет - iotr не инициализируется вообще. Но в остальном - все терпимо. Подход странноват - зачем двигать положительные элементы, как "паровозик", если можно было их просто присвоить по одному в начало массива. Но вроде работает.)

На каком входном массиве вы получили мусор?
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
15.03.2017, 19:33  [ТС] 5
TheCalligrapher, ой, вы меня похвалили. Приятно стало
Я просто решил поинтересоваться, что будет, если залезть за пределы вновь определённой динамической переменной и получил, то переполнение, то нули и даже некоторые старые отрицательные элементы. Другими словами, решил порыться в мусоре. Делал я это путём увеличения значения iotr в выражении последнего цикла. Просто стало интересно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2017, 19:33
Помогаю со студенческими работами здесь

Только realloc
Не хочет работать программа(возвращает неправильные числа+проблема с выводом) Во вложении скрин...

Использование realloc
Доброго времени суток. Определен динамический массив, он вводится. Затем нужно увеличить размер...

Realloc в функции
Есть функция void read_line(char *adress) { char temp = '1'; unsigned long long int...

Перевыделение памяти realloc
Есть двумерный массив char **inpWords, в который я добавляю слова из файла, отсеивая пробельные...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru