2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
|
||||||
1 | ||||||
Как узнать, сколько байтов памяти занимает массив13.04.2019, 20:07. Показов 10141. Ответов 36
Я за Си сижу уже.. полчаса..
встала задача: узнать количество памяти, который занимает массив, память к которому я выделяю динамически через calloc() пробовал sizeof(), но он выводит только "4".. на данный момент код выглядит так
0
|
13.04.2019, 20:07 | |
Ответы с готовыми решениями:
36
Как узнать сколько байтов в памяти занимает объект? Как узнать сколько программа занимает памяти ? Как узнать, в процесе отладки, сколько памяти занимает программа? Как узнать сколько памяти занимает таблица и каждый столбец в таблице |
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
13.04.2019, 20:20 | 2 |
Так ведь в функцию calloc вы сами передаете размер массива, в чем проблема взять оттуда?
Если же речь про то, как узнать размер стороннего массива, выделенного непонятно где, то никак.
1
|
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
|
|
13.04.2019, 21:12 [ТС] | 4 |
а если я, например, через realloc добавляю динамической памяти?
Можно хотя бы узнать величину массива?
0
|
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
|
|
13.04.2019, 21:41 [ТС] | 7 |
ValeryS, я в первом же сообщении скинул код. 19 строка.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
13.04.2019, 21:44 | 8 |
вот это?
что такое Array? это указатель указатель на область памяти которую ты выделил, а может еще и не выделил а какой размер у указателя? бывает 2 бывает 4 бывает 8, может еще какие бывают но я не встречал вот тебе sizeof(Array) и вернул 4, указав что размер указателя 4 байта
0
|
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
|
|
13.04.2019, 22:16 [ТС] | 9 |
Как тогда узнать размер выделенной области памяти, указатель на который у меня хранится как Array?
0
|
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
|
|
14.04.2019, 06:45 [ТС] | 11 |
Ну лаааадно. Спасибо всем
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
14.04.2019, 09:34 | 13 |
Поэтому в функцию, принимающую для обработки динамический массив, приходится передавать и его размер и это не всегда удобно. Тем более что размер указателя где-то хранится (насколько я помню, где именно - зависит от реализации), но нет стандартного механизма его узнать.
Добавлено через 9 секунд Поэтому в функцию, принимающую для обработки динамический массив, приходится передавать и его размер и это не всегда удобно. Тем более что размер указателя где-то хранится (насколько я помню, где именно - зависит от реализации), но нет стандартного механизма его узнать.
0
|
Заблокирован
|
|
14.04.2019, 11:41 | 14 |
Это почему же?
Указатель - это целое без знака. Его размер зависит только от разрядности компилятора и железобетонно равен ей (разрядности), делённой на 8 (бит в байте). Размер всех статических переменных известен во время компиляции, он не хранится НИГДЕ.
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
14.04.2019, 12:49 | 15 |
почему - что?
Почему надо передавать? Потому что сам указатель не хранит информацию о размере данных, на которые указывает, а функции надо знать где остановиться. Почему это неудобно? Потому что это лишний параметр, который надо отдельно хранить и передавать. Разумеется, я имел в виду массив по указателю. Неудачно выразился.
0
|
Заблокирован
|
|
14.04.2019, 14:10 | 16 |
Это нормально. Размер в любом случае надо хранить и передавать.
Конечно, в таблице менеджера памяти хранятся пары "адрес:размер", но как эту инфу поиметь в прикладной программе, я не знаю, ибо за 20+ лет практики у меня ни разу не возникло ситуации, где это было бы нужно.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
14.04.2019, 15:01 | 17 | |||||
кто тебе это сказал?
менеджер памяти вполне себе может выделить блок и больше, так ему удобней, чтобы меньше была дефрагментация. например просишь один байт а выделило 1 килобайт и этот размер и хранится пример со статическим массивом, пример надуманный
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
|
|
14.04.2019, 17:24 | 18 |
Это нормально для Си. В более высокоуровневых языках размер массива можно определить через метод класса или что-то подобное.
[quote="ValeryS;13491942"]кто тебе это сказал? менеджер памяти вполне себе может выделить блок и больше, так ему удобней, чтобы меньше была дефрагментация. Потому что запрошено было не 5 а 128. Считаем вместе: (SIZE-1) = 4 ; 4/128 = 0 ; 0+128 = 128. Не считая, конечно, ошибки с точкой с запятой после пятерки, из-за которой этот код вообще не соберется. Между прочим, как раз sizeof() в таком не ошибается, поскольку работает на уровне компиляции и смотрит размер типа данных, а не особенности выделения памяти в конкретной ОС.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
14.04.2019, 18:12 | 20 | |||||
хорошо, вот тебе реализация malloc от Keila для УСБ
и к тому же я сказал так что претензии типа отметаю
0
|
14.04.2019, 18:12 | |
14.04.2019, 18:12 | |
Помогаю со студенческими работами здесь
20
Как узнать, сколько памяти занимает тот или иной элемент программы? Узнать сколько занимает памяти объект. Определить, сколько места занимает в динамической памяти массив Определить, сколько места занимает в динамической памяти данный массив Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |