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

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

05.01.2016, 00:49. Показов 1108. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru