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

Динамическое выделение памяти

23.08.2013, 16:49. Показов 957. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую.

Имеется код:
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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct{
    int age;
    char* name;
} human;
 
typedef struct{
    char* str;
} test;
 
int resize(human* p, int n) {
    
    p = (human*) realloc(p, (n + 1) * sizeof(human));
    /* if(!p) ... */
    (p + n)->age = 32;
    (p + n)->name = "Victor";
    
    return n + 1;
}
 
void print_all(human* p, int n) {
    
    int i;
    for(i = 0; i < n; ++i) {
        printf("%d: %s | %d\n", i, (p+i)->name, (p+i)->age);
    }
}
 
int main(int argc, char** argv) {
    
    human* ptr1;
    int n1 = 1;
    
    test* ptr2;
    int n2 = 1;
    
    ptr1 = (human*) malloc(n1 * sizeof(human));
    /* if(!ptr1) ... */
    ptr1->age = 23;
    ptr1->name = "Ivan";
    print_all(ptr1, n1);
    
    ptr2 = (test*) malloc(n2 * sizeof(test));
    /* if(!ptr2) ... */
    ptr2->str = "test";
    
    n1 = resize(ptr1, n1);
    print_all(ptr1, n1);
    
    free(ptr1);
    free(ptr2);
    return 0;
}
Он компилируется без ошибок и предупреждений (компилятор gcc), но при выполнении вылетает Segmentation fault.

Цитата Сообщение от debug info
Кликните здесь для просмотра всего текста
До выполнения функции resize переменная ptr1 имеет значение 0x602010,
переменная p принимает значение 0x602010,
после срабатывания функции realloc переменная p принимает значение 0x602050,
и после выхода из функции resize переменная ptr1 всё так же остаётся со значением 0x602010, то есть не изменяется.
И вот хотелось бы спросить правильно ли такое решение? (Изменил код функции resize и код её вызова)
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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct{
    int age;
    char* name;
} human;
 
typedef struct{
    char* str;
} test;
 
int resize(human** p, int n) {
    
    *p = (human*) realloc(*p, (n + 1) * sizeof(human));
    /* if(!*p) ... */
    (*p + n)->age = 32;
    (*p + n)->name = "Victor";
    
    return n + 1;
}
 
void print_all(human* p, int n) {
    
    int i;
    for(i = 0; i < n; ++i) {
        printf("%d: %s | %d\n", i, (p+i)->name, (p+i)->age);
    }
}
 
int main(int argc, char** argv) {
    
    human* ptr1;
    int n1 = 1;
    
    test* ptr2;
    int n2 = 1;
    
    ptr1 = (human*) malloc(n1 * sizeof(human));
    /* if(!ptr1) ... */
    ptr1->age = 23;
    ptr1->name = "Ivan";
    print_all(ptr1, n1);
    
    ptr2 = (test*) malloc(n2 * sizeof(test));
    /* if(!ptr2) ... */
    ptr2->str = "test";
    
    n1 = resize(&ptr1, n1);
    print_all(ptr1, n1);
    
    free(ptr1);
    free(ptr2);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2013, 16:49
Ответы с готовыми решениями:

Динамическое выделение памяти
Пользователь вводит число. Программа динамически выделяет массив типа char размера n, c помощью...

Динамическое выделение памяти
Нужно организовать динамическое выделение в этой программе: #include &lt;stdio.h&gt; #include...

Динамическое выделение памяти
Всем привет! Недавно начал изучать Си, и возник такой вопрос (кажется, дурацкий, но все же): почему...

Динамическое выделение памяти
Всем привет! Решил вот разобраться с выделением памяти.В общем выделяем память для двух матриц...

6
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
23.08.2013, 17:37 2
Сейчас по крайней мере resize выглядит верно. Не вылетает?
0
8 / 8 / 2
Регистрация: 10.08.2013
Сообщений: 22
23.08.2013, 17:49  [ТС] 3
Цитата Сообщение от castaway Посмотреть сообщение
Не вылетает?
Нет, всё отлично отрабатывает
0: Ivan | 23

0: Ivan | 23
1: Victor | 32

ВЫПОЛНЕНИЕ FINISHED; значение выхода 0;
0
Z3JheSBoYXQ=
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
23.08.2013, 17:54 4
C
1
2
3
4
5
6
7
8
9
int resize2(human *p){  
  p = realloc(p, sizeof(human)*2);     
  (p+sizeof(human))->age=100;
  (p+sizeof(human))->name="Fedor";  
  printf("Segment 1: %s %d %#x\n", p->name, p->age, p);
  printf("Segment 2: %s %d %#x\n", (p+sizeof(human))->name,(p+sizeof(human))->age, p);
  
  return 0;
}
Bash
1
2
3
4
Segment 1: Ivan 23 0x17eb8b0
Segment 2: Fedor 100 0x17eb8b0
 
[spouk@/mnt/big1gb/hddDevelop/source/c/2013$]
Добавлено через 2 минуты
адрес указателя при изменении размера памяти в сторону увеличения может быть и тот же, просто обращение проходит как в обычном индексе, где индексом выступает размер сегмента.
1
8 / 8 / 2
Регистрация: 10.08.2013
Сообщений: 22
23.08.2013, 18:25  [ТС] 5
Возможно не ясна задача.

Нужно при каждом вызове функции resize добавлять нового человека и увеличивать общее количество людей(n1), т.е. чтобы в вызывающей функции(main) можно было использовать следующий код
C
1
2
3
4
5
6
7
8
9
/* Информация о первом человеке */
printf("%s | %d\n", ptr1->name, ptr1->age);
 
/* Информация о последнем человеке */
printf("%s | %d\n", (ptr1 + n1 - 1)->name, (ptr1 + n1 - 1)->age);
/*
Ivan | 23
Victor | 32
*/
На данный момент второй вариант кода вполне справляется с этой задачей, но что-то меня в нём настараживает

Цитата Сообщение от #2
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct{
    int age;
    char* name;
} human;
 
typedef struct{
    char* str;
} test;
 
int resize(human** p, int n) {
    
    *p = (human*) realloc(*p, (n + 1) * sizeof(human));
    /* if(!*p) ... */
    (*p + n)->age = 32;
    (*p + n)->name = "Victor";
    
    return n + 1;
}
 
void print_all(human* p, int n) {
    
    int i;
    for(i = 0; i < n; ++i) {
        printf("%d: %s | %d\n", i, (p+i)->name, (p+i)->age);
    }
}
 
int main(int argc, char** argv) {
    
    human* ptr1;
    int n1 = 1;
    
    test* ptr2;
    int n2 = 1;
    
    ptr1 = (human*) malloc(n1 * sizeof(human));
    /* if(!ptr1) ... */
    ptr1->age = 23;
    ptr1->name = "Ivan";
    
    ptr2 = (test*) malloc(n2 * sizeof(test));
    /* if(!ptr2) ... */
    ptr2->str = "test";
    
    n1 = resize(&ptr1, n1);
    printf("%s | %d\n", ptr1->name, ptr1->age);
    /* ... */
    printf("%s | %d\n", (ptr1 + n1 - 1)->name, (ptr1 + n1 - 1)->age);
    
    free(ptr1);
    free(ptr2);
    return 0;
}
0
Z3JheSBoYXQ=
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
23.08.2013, 19:34 6
Я бы отказался от использования realloc и использовал чистый calloc и списки. Имхо, .т.к. работа, исходя из постановки задачи ведется с фиксированным по размеру блоками памяти.Кстати ты и сам видишь, что твоя реализация последняя больше напоминает список, т.к. выделение в ресайзе идет как двумерный массив, читай что список
1
8 / 8 / 2
Регистрация: 10.08.2013
Сообщений: 22
23.08.2013, 20:08  [ТС] 7
Цитата Сообщение от fanatdebian
чистый calloc и списки
Спасибо, попробую

Добавлено через 19 минут
Дело всё в том, что я еще толком не разобрался с указателями, а уже полез в такие дебри... И в итоге разыменование указателя на указатель, вот это меня то и смущало
0
23.08.2013, 20:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2013, 20:08
Помогаю со студенческими работами здесь

Динамическое выделение памяти
Прошу помощи опытных программистов, изначально размеренность динамического массива равна 2 и если...

Динамическое выделение памяти
Здравствуйте! Хочу часть кода,где динамически выделяется память под массив: double *darr; ...

Динамическое выделение памяти
int *a = (int*)malloc(n * sizeof(int)); int *a // это тип указателя (int* ) // зачем вот это...

Динамическое выделение памяти
Необходимо выделить память с помощью функции melloc под 5 символов char. При вводе пользователем...

Динамическое выделение памяти в С
Ввести num - количество массивов. Ввести размерность очередного массива и его элементы целого типа,...

Динамическое выделение памяти
задали задание по Си, сделать через динамическое выделение памяти. эту тему пропустил. читал...


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

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

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