0 / 0 / 0
Регистрация: 30.05.2015
Сообщений: 2
1

Использование realloc

07.12.2017, 09:26. Показов 7234. Ответов 4
Метки нет (Все метки)

Доброго времени суток. Определен динамический массив, он вводится. Затем нужно увеличить размер этого же массива (7 строка объявление массива, 71 строка - объявление нового массива, с 72 строки - работа с новым массивом, ошибка в 91 строке):
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <stdlib.h>
# include <stdbool.h>
 
int main(){
     
    int *a, *b, n, k, i;
    bool d = true;
    
    printf("Enter size of mas: ");
    scanf("%d", &n);
    
    
    //Malloc  
    
    a = (int*)malloc(n * sizeof(int));    
      
    printf("Enter elements :\n");
    for (i = 0; i < n; i++)
        scanf("%d", a + i);
        
    printf("Enter the number you need: \n");
    scanf("%d", &k);
        
     for (i = 0; i < n; i++)
       if( *(a + i) == k ){
           printf("%d\n", i + 1);
           d = false;
       } 
       
       if(d)
         printf("NO\n");
      
      free(a);
    //--------------------------
    
    printf("First metod worked!\n");
    printf("Begining a part 2\n");
    
    //Calloc       
    b = (int*) calloc(n , sizeof(int)); 
    
    printf("Enter elements :\n");
    for (i = 0; i < n; i++)
        scanf("%d", a + i);
        
    printf("Enter the number you need: \n");
    scanf("%d", &k);
        
     for (i = 0; i < n; i++)
       if( *(a + i) == k ){
        
         printf("%d\n", i + 1);
         d = false;
       }         
      
      if(d)
         printf("NO\n");
         
      free(a);    
     //--------------------------
     
    printf("Second metod worked!\n");
    printf("Begining a part 3\n");
     
     //Realloc     
     int r = 0;
     printf("Add size of mas:");
     scanf("%d", &r);
     
     int *a_n;
     a_n = (int*) realloc(a, r*sizeof(int));
     
     printf("Add mas:");
     for(i = 0; i < r + n; i++)
       scanf("%d", a_n + i);
       
     printf("Enter the number you need: \n");
       scanf("%d", &k);
        
     for (i = 0; i < r + n; i++)
       if( *(a_n + i) == k ){
          
          printf("%d\n", i + 1);
          d = false;
       }       
       
       if(d)
        printf("NO\n"); 
     
     free(a);
     
     //--------------------------
     
    printf("Third metod worked!\n");
    printf("The program worked!\n");
    printf("The end of the program!\n");
    
  return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2017, 09:26
Ответы с готовыми решениями:

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

Функция realloc
Есть такой фрагмент кода: /* поиск отрицательных элементов и их размещение в конце массива*/ ...

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

Проблема с realloc
22 строчка выделение памяти через realloc, 3 первых прокрутки цикла работают, а дальше все...

4
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
07.12.2017, 09:56 2
Переменная a_n не нужна, сохраняйте новый адрес массива в ту же переменную:
C
1
a = (int*) realloc(a, r*sizeof(int));
1
562 / 392 / 128
Регистрация: 02.10.2008
Сообщений: 1,611
Записей в блоге: 1
07.12.2017, 11:50 3
realloc(a, new_size) работает следующим образом - грубо описываю:
1. делается malloc(новый_размер) во временную переменную внутри реалок
2. Если malloc() вернул NULL, то он и возвращается функцией, при этом c памятью, на которую указывает a ничего не происходит(и её можно освобождать через free())
3.Если всё норм, то по новому адресу переносится содержимое со старого адреса (вроде даже через обычный memcpy)
4. Освобождается старая память с адресом, переданным через a, а именно free(a)
5. возвращается новый указатель

Вы присвоили новый указатель a_n - в принципе правильно(но как выше сказано можно и в старую переменную a). Т.к. realoc() у вас нормально отработал, то память из переменной a он освободил через free(), а вы в 91й строке её пытаетесь повторно освободить. Во времена ДОСа и относительно простых компиляторов это приводило к дичайшим чудачествам не только проги, но и ОС в целом.

Добавлено через 6 минут
З.Ы. И да, для языка Си очень неправильно объявлять переменные внутри кода (в начале программного блока "{}"можно) - строки 67,71
2
3545 / 2215 / 402
Регистрация: 09.09.2017
Сообщений: 9,228
07.12.2017, 11:59 4
Цитата Сообщение от likehood Посмотреть сообщение
Переменная a_n не нужна, сохраняйте новый адрес массива в ту же переменную:
Правильнее все-таки использовать новую переменную и проверять ее:
C
1
2
3
4
5
a_n = (int*)realloc(a, r*sizeof(int));
if(a_n)a = a_n;
  else error();
...
free(a);
2
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
07.12.2017, 12:01 5
COKPOWEHEU, да, так будет точнее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2017, 12:01
Помогаю со студенческими работами здесь

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

Realloc и malloc
Здравствуйте. У меня такой вопрос: возможно в Си нечто вроде конфликта между realloc() и...

Realloc(): invalid pointer
void str_cat(char** str,const char* s){ int LenStr = 0; if(*str != NULL){ LenStr =...

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


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

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

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