Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2

Функция malloc() динамически увеличивает выделение памяти по мере необходимости?

05.01.2016, 00:49. Показов 1120. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим, задаю malloc(3). Т.е. 3 байта. А переменная (точнее, массив, который получается динамическим) со временем (в цикле) становится большой - и памяти хватает, ошибок нет. Но если malloc() вообще не задавать, то ошибка появляется (Segmentation fault).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2016, 00:49
Ответы с готовыми решениями:

Динамическое выделение памяти по мере необходимости
Есть структура struct AeroFlot { char destination; char tip; int nomer; int zanmest; int...

Как динамически создавать структуры по мере необходимости?
Для хранения символа и его координат создаю структуру. struct sym { char ch; int x; int y; }; Далее где-нибудь в...

Выделение памяти (malloc)
Я пишу выделение памяти. У каждой задачи точно есть две таблицы страниц (0 - 0-3FFFFFh, 1 - 400000h-7FFFFF). 0 таблица описывает контекст...

12
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.01.2016, 01:43
Цитата Сообщение от Htext Посмотреть сообщение
и памяти хватает, ошибок нет.
вам так только кажется. Для перевыделения памяти используйте realloc
1
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
05.01.2016, 02:52  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
вам так только кажется.
Получается (в моем случае), что массив залазит на не выделенную для него область памяти?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.01.2016, 03:09
Цитата Сообщение от Htext Посмотреть сообщение
Получается (в моем случае), что массив залазит на не выделенную для него область памяти?
Нет. Массив занимает определенный участок памяти. До и после него - другая память. Доступ вы получаете по указателю, т.е. границы массива не контролируются.

P.S. Код покажите для точного ответа.
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
05.01.2016, 11:10  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
Код покажите для точного ответа.
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
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <cstdlib>
char buf_recv1[8]; 
char *mes_summ;
int i;
int main()
{char buf_recv1[]="1234567";
    mes_summ="Begin";
i=0; 
printf("\n");
//Выделяем память
if((mes_summ = (char*)malloc(1))==NULL){
perror("Allocation error.");
exit (0);
}
 
while(1){  //Цикл
i=i+1;
printf("Переменная i = %d\n",i);
mes_summ=strcat(mes_summ, buf_recv1);
printf ("Итоговая строка: %s\n", mes_summ);
    getchar(); 
             } //Цикл
    return 0;
}
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.01.2016, 11:16
Htext, честно говоря это какая-то мешанина. Сделать что хотите?

P.S. А почему тема переехала, вчера вроде в С разделе была, разве нет?
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
05.01.2016, 11:59  [ТС]
Да ну, код-то примитивный. Неужели непонятен?)
Я хочу выяснить, почему для работы программы достаточно выделения лишь 1 байта памяти, хотя размерность массива может быть очень большой - в процессе ее выполнения.
Тема никуда не переезжала.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.01.2016, 12:27
Цитата Сообщение от Htext Посмотреть сообщение
Да ну, код-то примитивный. Неужели непонятен?)
Так и есть. Мне непонятно что и зачем вы делаете.
Вот это вот все зачем?
C++
1
2
3
4
5
6
7
8
9
10
#include <sys/types.h>
#include <sys/socket.h>
...
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <netinet/in.h>
...
#include <cstdlib> //вкупе с stdlib.h выглядит очень странно.
C++
1
char buf_recv1[8]; char *mes_summ; int i;
где-то кроме main используем? Нет. Зачем делать глобальным?
C
1
mes_summ="Begin";
вроде бы присвоили значение. Но через пару строк перекидываете указатель:
C
1
if((mes_summ = (char*)malloc(1))==NULL){
Про форматирование и комментирование тоже забывать не стоит.
Вот это я называю мешаниной.

Хотите чтобы вам действительно помогли? Задайте конкретный вопрос,а лучше продемонстрируйте его на минимальном примере.
Будет неплохо увидеть список источников, которые вы уже изучили для прояснения вопроса.

Кстати, зачем писать на С++ как на С? std::string, new/delete, STL , smartpointers уже отменили?

Не по теме:


Цитата Сообщение от Htext Посмотреть сообщение
Тема никуда не переезжала.
Я был уверен,что читал её в разделе С. Впрочем это не важно.

0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
05.01.2016, 12:44  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
Но через пару строк перекидываете указатель
Указатель задается не массиву mes_summ, а функции malloc, так как по умолчанию у нее void*. А у malloc меняется указатель потому, что mes_summ имеет тип char. Вы совсем не о том говорите.
Вопрос повторяю (лично для Вас) в 3-й раз:
Цитата Сообщение от Htext Посмотреть сообщение
Я хочу выяснить, почему для работы программы достаточно выделения лишь 1 байта памяти, хотя размерность массива может быть очень большой - в процессе ее выполнения.
Добавлено через 1 минуту
Цитата Сообщение от S_el Посмотреть сообщение
Вот это вот все зачем?
Это не помешает ответу на мой вопрос (если отвечает знающий человек).

Добавлено через 2 минуты
Цитата Сообщение от S_el Посмотреть сообщение
Кстати, зачем писать на С++ как на С?
Потому, что хочу разобраться приведенном мной конкретном простом примере.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.01.2016, 12:50
Цитата Сообщение от Htext Посмотреть сообщение
Указатель задается не массиву mes_summ, а функции malloc, так как по умолчанию у нее void*. А у malloc меняется указатель потому, что mes_summ имеет тип char.
не вижу. Я просто хочу понять, зачем вы так делаете
C
1
2
3
char *mes_summ;
 mes_summ="Begin"; 
 if((mes_summ = (char*)malloc(1))==NULL){

Цитата Сообщение от Htext Посмотреть сообщение
Вопрос повторяю (лично для Вас) в 3-й раз:
Так я вам уже ответил:
Цитата Сообщение от S_el Посмотреть сообщение
Массив занимает определенный участок памяти. До и после него - другая память. Доступ вы получаете по указателю, т.е. границы массива не контролируются.
могу пояснить другими словами - для работы программы НЕдостаточно выделения лишь 1 байта памяти, так как размер данных(размерность массива в частности) может быть очень большой.
Что ведет к ошибкам программы.

Цитата Сообщение от Htext Посмотреть сообщение
Это не помешает ответу на мой вопрос (если отвечает знающий человек).
Это ошибочное мнение. Уважайте людей, которые пытаются вам помочь. Знающий человек увидев подобный код скорее всего даже и разбираться не станет,а просто порекомендует переписать код и приходить если ошибка не исчезнет.
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
05.01.2016, 14:03  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
для работы программы НЕдостаточно выделения лишь 1 байта памяти
Но, к счастью-сожалению, она работает, делая то, что от нее требуется. Вот я и хочу знать - почему. Если же убрать
Цитата Сообщение от S_el Посмотреть сообщение
malloc(1)
- ошибка сегментации возникает. Однако, почему-то этот один(!) байт позволяет программе работать, массив может разрастаться сколько угодно, вроде бы. Видимо, он использует свободную, для него не предназначенную, память. И все обходится без realloc().
Цитата Сообщение от S_el Посмотреть сообщение
Я просто хочу понять, зачем вы так делаете

char *mes_summ;
mes_summ="Begin";
if((mes_summ = (char*)malloc(1))==NULL){
если Ваш вопрос про проверку if - это для того, чтобы избегнуть ситуации, если ВДРУГ malloc вернет нулевой аргумент, т.е. если ей не хватит памяти, чтобы ее можно было выделить. Пишут, что в таком случае может возникнуть серьезная ошибка, даже возможен крах системы. Понятно, что сейчас ОП - уже давно на 8 кБ (как было в системах на PDP, к примеру) в расчете на одного User. Но, тем не менее. Т.е. это условие - на всякий случай.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.01.2016, 14:42
Цитата Сообщение от Htext Посмотреть сообщение
если Ваш вопрос про проверку if - это для того, чтобы избегнуть ситуации
нет, это то как раз понятно, я про 2-ую строку.

Цитата Сообщение от Htext Посмотреть сообщение
- ошибка сегментации возникает.
т.к. память выделена на стеке,вместо кучи(надеюсь здесь это терминология применима,если нет - меня поправят эксперты).

Цитата Сообщение от Htext Посмотреть сообщение
Видимо, он использует свободную, для него не предназначенную, память. И все обходится без realloc().
Я именно это вам и написал уже 2 раза.
То,что в вашем случае программа отработала корректно, еще не значит что в ней нет ошибок.
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
05.01.2016, 15:09
Цитата Сообщение от Htext Посмотреть сообщение
и памяти хватает, ошибок нет
А ты free-то вызови попробуй в конце. Это во-первых.
Во-вторых, у тебя только один блок памяти выделен. А ты попробуй работать с большим количеством блоков и наблюдай как у тебя данные начнут неожиданно друг друга перезаписывать. Будешь записывать строку, а испортишь где-нибудь массив целых чисел. Либо просто падать, когда доходить до области памяти не доступной на запись. Это и есть ошибки.
Цитата Сообщение от Htext Посмотреть сообщение
Получается (в моем случае), что массив залазит на не выделенную для него область памяти?
Да. И лишь от случайности (рантайм библиотеки С и ОС) зависит то, в какой момент ты попытаешься записать в область памяти, которая не доступна твоей программе на запись.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2016, 15:09
Помогаю со студенческими работами здесь

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

Выделение памяти malloc
Подскажите как мне выделить два массива через malloc, пробою вот так #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include...

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

Выделение памяти malloc realloc
мне задачу поставили, надо не используя stl, загрузить из файла данные. r - строки с - это столбцы выдается сообщение ...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru