Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
1

Зачем выделять память с помощью malloc, а также с помощью new?

11.06.2015, 18:53. Просмотров 799. Ответов 17
Метки нет (Все метки)

Поясните пож. компилятор мингв. Работаю с массивом и ни как не могу понять как с ним работать правильно. Варианты: делал указатель и от него просто садил значения в массив иногда работало. Вопрос зачем выделять память с помощью malloc, а также с помощью new, чем отличается от последнего? sizeof(массив) в итоге неправильное значение выдает???
если учесть что с помощью указателей можно напрямую к памяти обращаться я могу быть уверен что a[0], a[1] идут друг за другом?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2015, 18:53
Ответы с готовыми решениями:

Как корректно очистить память, которая была выделена с помощью malloc?
Добрый день. Как корректно очистить память, которая была выделена с помощью...

Создать бесконечный двумерный массив с помощью malloc realloc
Требуется создать бесконечный двумерный массив. С помощью malloc realloc. Идея...

Синхронизация потоков с помощью критических секций через общую память
С 1 потоком работает нормально, а вот с 2 и более нет. Синхронизация с помощью...

Функция realloc отказывается выделять память
#include <stdio.h> #include <stdlib.h> #define MAX_WORD_LENGTH 20 #define...

Всегда необходимо выделять память из кучи под строки?
Добрый день. Сейчас читаю книжку "Understanding and Using C Pointers", которая...

17
drfaust
330 / 217 / 79
Регистрация: 02.10.2008
Сообщений: 839
Записей в блоге: 1
Завершенные тесты: 1
11.06.2015, 19:20 2
Указатель - это просто переменная с адресом, памяти под массив нет, её нужно выделить, для начала лучше использовать a=malloc(sizeof(тип_хранящегося_элемента)*кол_во_элементов_в_массиве), затем не забыть освободить с помощью free();
a[0],a[1],a[2] - ,будут идти последовательно (всегда);
операторы new и delete - это привилегия С++, а не С и с выделением и освобождением памяти для массивов с помощью этих операторов есть ньюансы
0
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
11.06.2015, 19:36  [ТС] 3
Так и не понял.
char *r;
r[0]='1';
r[1]='2';
Будет работать? Это правильно?
маллок как то херово выделяет память и вообще зачем ее выделять если и так работает?

Добавлено через 11 минут
drfaust, Так и не понял.
char *r;
r[0]='1';
r[1]='2';
Будет работать? Это правильно?
маллок как то херово выделяет память и вообще зачем ее выделять если и так работает?
0
drfaust
330 / 217 / 79
Регистрация: 02.10.2008
Сообщений: 839
Записей в блоге: 1
Завершенные тесты: 1
11.06.2015, 20:05 4
Цитата Сообщение от harumamburu Посмотреть сообщение
char *r;
r[0]='1';
r[1]='2';
Будет работать? Это правильно?
маллок как то херово выделяет память и вообще зачем ее выделять если и так работает?
Ты портишь чужую память - неизвестно куда указывает r
0
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
11.06.2015, 20:14  [ТС] 5
drfaust, а почему sizeof ерунду показывает? после маллока?
0
drfaust
330 / 217 / 79
Регистрация: 02.10.2008
Сообщений: 839
Записей в блоге: 1
Завершенные тесты: 1
11.06.2015, 21:23 6
Если используешь как sizeof(r) то он покажет 4 на 32битной системе и 8 на 64битной системе.
r - указатель, т.е адрес к-либо памяти.
http://www.c-cpp.ru/books/operator-sizeof
0
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
11.06.2015, 21:27  [ТС] 7
drfaust, ок тогда как можно определить размер динамического массива?
0
drfaust
330 / 217 / 79
Регистрация: 02.10.2008
Сообщений: 839
Записей в блоге: 1
Завершенные тесты: 1
11.06.2015, 21:29 8
Цитата Сообщение от drfaust Посмотреть сообщение
a=malloc(sizeof(тип_хранящегося_элемента)*кол_во_элементов_в_массиве),
А в маллок я что передавал?
Читайте внимательнее.
0
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,189
Завершенные тесты: 1
11.06.2015, 21:36 9
Цитата Сообщение от harumamburu Посмотреть сообщение
char *r;
r[0]='1';
r[1]='2';
Будет работать?
зависит от фазы луны и погоды на марсе
Цитата Сообщение от harumamburu Посмотреть сообщение
Это правильно?
нет
для того чтобы писать в память нужно чтобы тебе эту память система дала
в частности
arr[10] выделит 10 ячеек памяти на стеке, если объявление локальное, или в глобальной области если объявление гловальное
arr*= malloc(10) выделит 10 ячеек в куче
в твоем примере ты пишешь в память которая тебе не принадлежит, чем это кончится?
или неправильной работай программы, глюки и концов не найдешь, или крахом программы, что правильно неправильная программа не должна жить, или крахом системы это вообще аут, кстати большая часть глюков винды связана с неправильно написанными дровами, крушат чужую память
запись в неприналежащую тебе память может быть и при статическом объявлении массива
arr[10];
arr[10]=1;
выход за пределы массива со всеми прелестями
Цитата Сообщение от harumamburu Посмотреть сообщение
маллок как то херово выделяет память
в чем это выражается?
0
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
11.06.2015, 21:46  [ТС] 10
в чем это выражается?
ошибка вылетает
0
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,189
Завершенные тесты: 1
11.06.2015, 21:51 11
Цитата Сообщение от harumamburu Посмотреть сообщение
ошибка вылетает
какая? где?
кусок кода можешь привести?
0
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
11.06.2015, 21:55  [ТС] 12
ну я уже все переделал вообще qt использую. фишка такая в процедуре не больше четырех объявлений дин массив на последней валится
если не было памяти он бы все равно не так реагировал
0
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,189
Завершенные тесты: 1
11.06.2015, 22:00 13
Цитата Сообщение от harumamburu Посмотреть сообщение
е не больше четырех объявлений дин массив на последней валится
если не было памяти он бы все равно не так реагировал
а память то освобождал?
а проверить, что возвращает malloc после вызова?
если он вернул NULL значит не смог выделить память, и если после этого пытаться туда что то записать,то крах неизбежен, запись по нулевому адресу

Добавлено через 45 секунд
Цитата Сообщение от harumamburu Посмотреть сообщение
если не было памяти он бы все равно не так реагировал
а как бы он реагировал?
0
drfaust
330 / 217 / 79
Регистрация: 02.10.2008
Сообщений: 839
Записей в блоге: 1
Завершенные тесты: 1
12.06.2015, 01:36 14
Учиться, учится и ещё раз учиться
man malloc в помощь
0
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
12.06.2015, 15:41  [ТС] 15
а как бы он реагировал?
коменчу строку с маллоком все нормально не коменчу валится сам маллок крэш дает. На мой взгляд такого не может быть. Да и как может быть нуллл когда у меня всего раза 3 по 10-20 чара залочено

Добавлено через 8 минут
drfaust, да и еще можете взглянуть на тему со структурой там код который работает не так как я того хочу почему не разберу. Этот вопрос приоритетеней сейчас вообще говоря не дает мне шагать дальше. Я вообще на джаве специализировался последнее время но тут стало надо сишку с кутэ в руки взять. Хотя в своее время владел сишкой.
0
drfaust
330 / 217 / 79
Регистрация: 02.10.2008
Сообщений: 839
Записей в блоге: 1
Завершенные тесты: 1
12.06.2015, 19:19 16
С и java разные вещи, в особенности с работой с памятью
По последнему посту 0 инфы - хотя бы строку с маллоком и проверкой на NULL приведи
0
harumamburu
0 / 0 / 0
Регистрация: 11.06.2015
Сообщений: 10
14.06.2015, 17:11  [ТС] 17
drfaust, есть код со структурами можешь прокементировать??? пожалуйста)...
Не работает программа по работе со структурой "Элемент БД"
0
drfaust
330 / 217 / 79
Регистрация: 02.10.2008
Сообщений: 839
Записей в блоге: 1
Завершенные тесты: 1
15.06.2015, 18:09 18
RTFM
З.Ы. Толку давать тебе рыбу, если ты не желаешь ловить её сам?
0
15.06.2015, 18:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2015, 18:09

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

Зачем нужно преобразование при присваивании указателю результата вызова malloc?
Здравия всем! Когда я читал уроки по выделению памяти, там, в большинстве...

Не освобождается память от malloc
wchar_t* path; wchar_t* _path = L"\dasdasdaev\dfg"; if(!_path) return...


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

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

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