Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8

Выделение памяти malloc

19.10.2025, 14:15. Показов 1301. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.
Как можно узнать выделялась ли память с помощью malloc.
Дело в том что данные в массив могут заполняться как константами так и через ввод с клавиатуры. И в конце программы надо освобождать память (free()).
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.10.2025, 14:15
Ответы с готовыми решениями:

В чем разница между malloc() и (char *)malloc()
Прошу помочь разобраться: не могу понять в чем разница междуs=malloc(sizeof(char)); иs=(char...

Динамическое выделение памяти malloc()
Здравствуйте! Cкажите пожалуйста, как узнать каков максимальный объем памяти, который может...

Выделение памяти с использованием malloc
Доброго времени суток :) В общем есть следующий класс: class Addres { char name; char street;...

14
 Аватар для Pphantom
2319 / 1561 / 721
Регистрация: 17.03.2022
Сообщений: 5,031
19.10.2025, 14:21
Цитата Сообщение от MalyhevSergey Посмотреть сообщение
Как можно узнать выделялась ли память с помощью malloc.
Проверить, не вернула ли она NULL.

P.S. Понял, что вопрос можно истолковать двумя способами, и надо уточнить, что имеется в виду. Речь идет об успешности выделения памяти с помощью malloc() или о том, динамически она выделялась или статически? В первом случае ответ написан выше, во втором попытка применить free() к "нединамическому" указателю приведет к неопределенному поведению, так что информацию о (не)выделении памяти надо как-то сохранить.
1
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8
19.10.2025, 14:24  [ТС]
Проверял. В обоих ситуациях возвращает true.
динамически она выделялась или статически?
0
 Аватар для Pphantom
2319 / 1561 / 721
Регистрация: 17.03.2022
Сообщений: 5,031
19.10.2025, 14:28
Цитата Сообщение от MalyhevSergey Посмотреть сообщение
Проверял. В обоих ситуациях возвращает true.
А вы разделом форума не ошиблись? Что такое "true" в C?

Или, как вариант - как проверяли? Приведите пример соответствующего кода.
0
Windows must die
673 / 855 / 103
Регистрация: 23.11.2021
Сообщений: 5,061
Записей в блоге: 17
19.10.2025, 14:31
На стадии отладки можно использовать макросы mcheck/mprobe.
В общем случае невозможно в раниайме определить, из какого сегмента адрес.

Добавлено через 2 минуты
А, ещё есть грязный трюк с realloc. Но будет сегфолт, если ему переменную из data-секции подсунуть.
Как вариант - хранить границы bss и data в переменных, заведя их в ld-скрипте.
0
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8
19.10.2025, 14:34  [ТС]
Понял. Спасибо.
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
19.10.2025, 14:49
Цитата Сообщение от MalyhevSergey Посмотреть сообщение
Дело в том что данные в массив могут заполняться как константами так и через ввод с клавиатуры. И в конце программы надо освобождать память (free()).
Не понял, в чём проблема.
Покаж кот.
0
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8
19.10.2025, 14:52  [ТС]
Надо очистить память
C
1
2
3
4
str = malloc (20*sizeof(char));
printf("Фамилия:  ");
scanf_s("%19s", str, 20);
n[0].Surname = str;
Не надо очищать память
C
1
(n[0]).Surname = "Пупкин";
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
19.10.2025, 15:04
MalyhevSergey, чо такое n? Массив структур с полями типа char*?

Добавлено через 8 минут
Цитата Сообщение от MalyhevSergey Посмотреть сообщение
Надо очистить память
C
1
2
3
4
str = malloc (20*sizeof(char));
printf("Фамилия: ");
scanf_s("%19s", str, 20);
n[0].Surname = str;
Не надо очищать память

C
1
(n[0]).Surname = "Пупкин";
Мож лучше сделать проще? Чем проще, тем надёжнее жэж...
C
1
2
3
4
5
6
7
8
9
10
11
12
#define MAX_SURNAME 20
 
n[0].Surname = (char*)malloc(MAX_SURNAME * sizeof(char));
printf("Фамилия: ");
scanf_s("%s", str, MAX_SURNAME);
 
n[1].Surname = strdup("Пупкин"); 
 
// удаление
for (idx = 0; idx != длина_массива_n; idx++)
  if (n[idx].Surname) 
    free(n[idx].Surname);
0
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8
19.10.2025, 15:58  [ТС]
чо такое n? Массив структур с полями типа char*?
Да
0
Злостный нарушитель
 Аватар для Verevkin
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
19.10.2025, 16:12
Лучший ответ Сообщение было отмечено Annemesski как решение

Решение

Цитата Сообщение от MalyhevSergey Посмотреть сообщение
Да
0
 Аватар для Storm Screamer
4867 / 1434 / 116
Регистрация: 21.04.2013
Сообщений: 8,679
19.10.2025, 17:13
В языке C нельзя напрямую определить, была ли память выделена с помощью malloc() (или других функций динамического выделения памяти, таких как calloc, realloc) только по указателю. То есть, если у вас есть указатель, вы не можете программно узнать, указывает ли он на динамически выделенную память или на статическую/автоматическую (например, на массив в стеке или глобальный массив).

malloc() возвращает просто адрес в куче, а указатель на статический/локальный массив - тоже просто адрес. С точки зрения программы это просто void* (или int*, char* и т.д.). Нет никакой "метки" в самом указателе, говорящей о происхождении памяти.

Самый надежный и распространенный способ - вести флаг или использовать разные переменные, чтобы отслеживать, была ли память выделена динамически.

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
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int *arr;
    int size = 10;
    int is_dynamic = 0; // флаг: 0 — статический/константный, 1 — динамический
 
    char choice;
    printf("Использовать константный массив (c) или ввод с клавиатуры (k)? ");
    scanf(" %c", &choice);
 
    if (choice == 'c') {
        // Используем статический массив
        static int const_arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        arr = const_arr;
        is_dynamic = 0;
    } else {
        // Выделяем память динамически
        arr = malloc(size * sizeof(int));
        if (!arr) {
            fprintf(stderr, "Ошибка выделения памяти\n");
            return 1;
        }
        is_dynamic = 1;
 
        printf("Введите %d чисел:\n", size);
        for (int i = 0; i < size; i++) {
            scanf("%d", &arr[i]);
        }
    }
 
    // ... работа с arr ...
 
    // Освобождение памяти только если она была выделена динамически
    if (is_dynamic) {
        free(arr);
    }
 
    return 0;
}
А такое приведет к неопределенному поведению:
C
1
2
3
if (arr != NULL) {
    free(arr); // ОШИБКА: если arr указывает на стек или глобальную память!
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
21.10.2025, 08:58
Цитата Сообщение от MalyhevSergey Посмотреть сообщение
динамически она выделялась или статически?
Это "проверить" никак нельзя.

Если вы сами выделяли память динамически, значит она выделялась память динамически. Просто запоминайте, как вы выделяли память - вот и весь ответ на ваш вопрос.
0
0 / 0 / 0
Регистрация: 17.10.2025
Сообщений: 8
21.10.2025, 09:12  [ТС]
Всем спасибо. Разобрался.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.10.2025, 10:19
Сделать обертки для malloc() и free() уже предлагали?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.10.2025, 10:19
Помогаю со студенческими работами здесь

Выделение памяти malloc
не работает пример из лекции , там пример на доске такой написан - #include &lt;stdlib.h&gt; int...

Компилятор ругается на выделение памяти malloc
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;locale.h&gt; /* СТУДЕНТ: ...

Выделение памяти через malloc и считывание данных
Здравствуйте. Имеется файл, в котором 6 чисел типа double. В программе имеется 2 массива. В 1-ый...

Выделение памяти malloc приводит к неправильным расчетам
Есть функция которая постоянно вызывается для расчетов. Она работает правильно, до тех пор пока я...

Malloc (выделение памяти двумерному массиву) - проверить код
Здравствуйте, подскажите пожалуйста, есть ли логические ошибки в блоке &quot;Выделения памяти:&quot;? План...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru