Форум программистов, компьютерный форум, киберфорум
Наши страницы
C (Си)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
animator404
97 / 97 / 12
Регистрация: 05.05.2013
Сообщений: 1,206
1

Понять динамическое распределение памяти (malloc)

09.01.2015, 22:48. Просмотров 889. Ответов 9
Метки нет (Все метки)

Пытаюсь понять динамическое распределение памяти, но пока безрезультатно.

Написал код:
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
typedef struct {
    int height;
    int size;
    int age;
    int someOtherValue;
}person;
 
int main() {
    //first case
    person * p1 = malloc(sizeof(person));
    printf("%lu\n",sizeof(p1));//prints 4
 
    //second case
    person p2;
    printf("%lu\n",sizeof(p2)); //prints 16
 
    //third case
    p1->size=123;
    p1->height=1233;
    printf("%lu\n",sizeof(p1));//prints 4
    
}
Создал структуру на 4 елемента, каждый по 4 байта. Получается 16.
Во втором случае(second case) выведется 16 - сума размеров всех елементов. Логично.

В первом случае, насколько я понял, память должна выделяться автоматически.
Тоесть при инициализации размер должен быть 0 (наверное), а он 4.

В последнем случае задал значения двум переменным p1 и предпологал, что на экран выведется - 8.
Но почему-то всеравно 4.

Кто может пояснить принцип работы выделения памяти в С?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2015, 22:48
Ответы с готовыми решениями:

Динамическое выделение памяти, нужен ли <malloc.h>?
если используешь функцию malloc, обязательно перед этим подключать соответствующую библиотеку...

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

Динамическое распределение памяти
#include &lt;stdio.h&gt; #define NUM 5 #define PREDM 1 typedef struct { char fam,name ; int...

Динамическое распределение памяти
Дан массив действительных случайных чисел а размером n=100. Выве-сти на экран те элементы массива,...

Динамическое распределение памяти
Здравствуйте, помогите в решении задачи. Дана действительная квадратная матрица порядка n....

9
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
10.01.2015, 00:25 2
Цитата Сообщение от animator404 Посмотреть сообщение
В первом случае, насколько я понял, память должна выделяться автоматически
В этом языке нет менеджемнта памяти. Вся ответственность за память кучи лежит на Вас. Вы создали указатель на сруктуру (адрес, выровненный по размеру структуры), далее Вы запросили систему выделить память размером в структуру и связать эту память со значением, на которое указывает указатель p1. По завершении надо освободить память.
Цитата Сообщение от animator404 Посмотреть сообщение
Тоесть при инициализации размер должен быть 0 (наверное), а он 4.
это размер указателя, а не того на что он указывает. Есть операция разыменонывания указателя (получение значения, которое находится по адресу, который хранит указатель).
C
1
2
3
int x = 5; /* допустим адрес x = 0xFFFF1234, значение x = 5 */
int *x_ptr = &x; /* допустим адрес x_ptr = 0xFFFFAABB, значение x_ptr = 0xFFFF1234 */
*x_ptr = 55; /* теперь x = 55 */
Добавлено через 10 минут
Цитата Сообщение от animator404 Посмотреть сообщение
Кто может пояснить принцип работы выделения памяти в С?
Если Вы расчитываете "взять язык с наскока", то придется понабивать шишек на хеловорлдах. Здесь нет абстракций, сахара и блекджеков из хай левел. Такие вещи как стек, список, очередь надо будет писать самому
1
animator404
97 / 97 / 12
Регистрация: 05.05.2013
Сообщений: 1,206
10.01.2015, 01:10  [ТС] 3
Цитата Сообщение от castorsky Посмотреть сообщение
Такие вещи как стек, список, очередь надо будет писать самому
Всмысле? А разве нет готовых реализаций?
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
10.01.2015, 01:14 4
Цитата Сообщение от animator404 Посмотреть сообщение
Всмысле?
В прямом смысле. Стандарт не предусматривает подобных вещей в языке. У плюсистов есть много блекждеков, а вот память они тоже выделяют и освобождают ручками.
Цитата Сообщение от animator404 Посмотреть сообщение
А разве нет готовых реализаций?
М.б. есть, не знаю. Я свои использую.
0
animator404
97 / 97 / 12
Регистрация: 05.05.2013
Сообщений: 1,206
10.01.2015, 01:17  [ТС] 5
castorsky, вот у Вас в коде во второй строчке в комментирии - "допустим адрес x_ptr = 0xFFFFAABB"
x_ptr это ведь и есть указатель, указатель на участок памяти. Разве у этого указателя тоже есть адрес?
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
10.01.2015, 01:18 6
Цитата Сообщение от animator404 Посмотреть сообщение
Разве у этого указателя тоже есть адрес?
Конечно, а как Вы думали биндятся "переменные"?

Добавлено через 46 секунд
Цитата Сообщение от animator404 Посмотреть сообщение
x_ptr это ведь и есть указатель, указатель на участок памяти.
Это адрес указателя. А значение указателя в моем примере это адрес переменной "x".
0
animator404
97 / 97 / 12
Регистрация: 05.05.2013
Сообщений: 1,206
10.01.2015, 01:19  [ТС] 7
castorsky, тогда и у этого указателя на тот указатель должен быть указатель?
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
10.01.2015, 01:21 8
не должен, но конечно может и быть. Указатель на указатель типа пишется двумя звездами.
int ** pointer_to_pointer_to_int;
1
animator404
97 / 97 / 12
Регистрация: 05.05.2013
Сообщений: 1,206
10.01.2015, 01:22  [ТС] 9
извращенство одним словом.
как жаль, что в микроконтроллер с 2 кб оперативной памяти не запихнуть прогу на джаве
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
10.01.2015, 01:24 10
Цитата Сообщение от animator404 Посмотреть сообщение
извращенство одним словом.
Ну почему же? Достойная замена ассемблеру.
Цитата Сообщение от animator404 Посмотреть сообщение
как жаль, что в микроконтроллер с 2 кб оперативной памяти не запихнуть прогу на джаве
И как, Вы можете убедиться, язык занимает свою нишу среди всех остальных.
0
10.01.2015, 01:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2015, 01:24

Динамическое распределение памяти в языке С
Помогите, пожалуйста решить задачу на С. В программе определите и инициализируйте переменную X...

Динамическое распределение памяти для символьной строки
Объясните, пожалуйста, почему при динамическом распределнии памяти под символьный массив у меня все...

Обработка массивов данных. Указатели. Динамическое распределение памяти
Помогите написать коды на си 1.Найти максимальный по модулю элемент массива. 2. Найти сумму...


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

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

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