Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/56: Рейтинг темы: голосов - 56, средняя оценка - 4.77
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
1

Как узнать, сколько байтов памяти занимает массив

13.04.2019, 20:07. Показов 10141. Ответов 36

Author24 — интернет-сервис помощи студентам
Я за Си сижу уже.. полчаса..
встала задача: узнать количество памяти, который занимает массив, память к которому я выделяю динамически через calloc()
пробовал sizeof(), но он выводит только "4"..
на данный момент код выглядит так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include<malloc.h>
int main(void)
{
    int Size;
    scanf_s("%d", &Size);
    int *Array;
    Array = (int*)calloc(Size, sizeof(int));
    //Ввод
    for (int i = 0; i < Size; i++)
    {
        printf_s("Array[%d]=", i);
        scanf_s("%d", &Array[i]);
    }
    
    printf("\n \n \n");
    int SizeByte;
    Array = (int*)malloc(3 * sizeof(int));
    printf("%d", sizeof(Array));
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2019, 20:07
Ответы с готовыми решениями:

Как узнать сколько байтов в памяти занимает объект?
Есть ли в Java аналог sizeOf?

Как узнать сколько программа занимает памяти ?
открываю Connect с Access (ADO) по таймеру идет Execute на UPDATE или INSERT это жутко жрет...

Как узнать, в процесе отладки, сколько памяти занимает программа?
Вот чтобы проследить за тем сколько и когда программа занимает и какое количество килобайт под...

Как узнать сколько памяти занимает таблица и каждый столбец в таблице
Как узнать сколько памяти занимает таблица и каждый столбец в таблице Access?

36
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
13.04.2019, 20:20 2
Так ведь в функцию calloc вы сами передаете размер массива, в чем проблема взять оттуда?
Если же речь про то, как узнать размер стороннего массива, выделенного непонятно где, то никак.
1
Заблокирован
13.04.2019, 20:32 3
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если же речь про то, как узнать размер стороннего массива, выделенного непонятно где, то никак.
В правильно написанной программе такого бардака быть не может.
0
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
13.04.2019, 21:12  [ТС] 4
а если я, например, через realloc добавляю динамической памяти?
Можно хотя бы узнать величину массива?
0
Заблокирован
13.04.2019, 21:19 5
Цитата Сообщение от DimaJoke Посмотреть сообщение
Можно хотя бы узнать величину массива?
В realloc() ты тоже задаёшь размер массива. Поэтому не надо его узнавать.

Как узнать, сколько байтов памяти занимает массив
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
13.04.2019, 21:39 6
Цитата Сообщение от DimaJoke Посмотреть сообщение
пробовал sizeof(), но он выводит только "4"..
покажи как
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
вот это?
Цитата Сообщение от DimaJoke Посмотреть сообщение
printf("%d", sizeof(Array));
что такое Array? это указатель
Цитата Сообщение от DimaJoke Посмотреть сообщение
int *Array;
указатель на область памяти которую ты выделил, а может еще и не выделил
а какой размер у указателя? бывает 2 бывает 4 бывает 8, может еще какие бывают но я не встречал
вот тебе sizeof(Array) и вернул 4, указав что размер указателя 4 байта
0
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
13.04.2019, 22:16  [ТС] 9
Как тогда узнать размер выделенной области памяти, указатель на который у меня хранится как Array?
0
Заблокирован
14.04.2019, 01:37 10
Цитата Сообщение от DimaJoke Посмотреть сообщение
Как тогда узнать размер выделенной области памяти, указатель на который у меня хранится как Array?
НИКАК.
0
2 / 0 / 2
Регистрация: 14.10.2018
Сообщений: 55
14.04.2019, 06:45  [ТС] 11
Ну лаааадно. Спасибо всем
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
14.04.2019, 08:51 12
Цитата Сообщение от DimaJoke Посмотреть сообщение
Как тогда узнать размер выделенной области памяти,
в общем случае никак, про это тебе уже сообщили
да и как ты не помнишь сколько памяти выделил?
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
14.04.2019, 09:34 13
Цитата Сообщение от Verevkin Посмотреть сообщение
В правильно написанной программе такого бардака быть не может.
Поэтому в функцию, принимающую для обработки динамический массив, приходится передавать и его размер и это не всегда удобно. Тем более что размер указателя где-то хранится (насколько я помню, где именно - зависит от реализации), но нет стандартного механизма его узнать.

Добавлено через 9 секунд
Цитата Сообщение от Verevkin Посмотреть сообщение
В правильно написанной программе такого бардака быть не может.
Поэтому в функцию, принимающую для обработки динамический массив, приходится передавать и его размер и это не всегда удобно. Тем более что размер указателя где-то хранится (насколько я помню, где именно - зависит от реализации), но нет стандартного механизма его узнать.
0
Заблокирован
14.04.2019, 11:41 14
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Поэтому в функцию, принимающую для обработки динамический массив, приходится передавать и его размер и это не всегда удобно.
Это почему же?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Тем более что размер указателя где-то хранится
Указатель - это целое без знака. Его размер зависит только от разрядности компилятора и железобетонно равен ей (разрядности), делённой на 8 (бит в байте). Размер всех статических переменных известен во время компиляции, он не хранится НИГДЕ.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
14.04.2019, 12:49 15
Цитата Сообщение от Verevkin Посмотреть сообщение
Это почему же?
почему - что?
Почему надо передавать? Потому что сам указатель не хранит информацию о размере данных, на которые указывает, а функции надо знать где остановиться.
Почему это неудобно? Потому что это лишний параметр, который надо отдельно хранить и передавать.
Цитата Сообщение от Verevkin Посмотреть сообщение
Указатель - это целое без знака.
Разумеется, я имел в виду массив по указателю. Неудачно выразился.
0
Заблокирован
14.04.2019, 14:10 16
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Почему это неудобно? Потому что это лишний параметр, который надо отдельно хранить и передавать.
Это нормально. Размер в любом случае надо хранить и передавать.
Конечно, в таблице менеджера памяти хранятся пары "адрес:размер", но как эту инфу поиметь в прикладной программе, я не знаю, ибо за 20+ лет практики у меня ни разу не возникло ситуации, где это было бы нужно.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
14.04.2019, 15:01 17
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Тем более что размер указателя где-то хранится (насколько я помню, где именно - зависит от реализации),
кто тебе это сказал?
менеджер памяти вполне себе может выделить блок и больше, так ему удобней, чтобы меньше была дефрагментация.
например просишь один байт а выделило 1 килобайт
и этот размер и хранится
пример со статическим массивом, пример надуманный
C
1
2
3
4
5
#define SIZE 5;
#define ARRSIZE (((SIZE)-1)/128+128)
 
char arr[ARRSIZE]
sizeof(arr);
sizeof(arr); покажет 128, хотя просил всего лишь 5
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
14.04.2019, 17:24 18
Цитата Сообщение от Verevkin Посмотреть сообщение
Это нормально. Размер в любом случае надо хранить и передавать.
Это нормально для Си. В более высокоуровневых языках размер массива можно определить через метод класса или что-то подобное.
[quote="ValeryS;13491942"]кто тебе это сказал?
менеджер памяти вполне себе может выделить блок и больше, так ему удобней, чтобы меньше была дефрагментация.
Цитата Сообщение от ValeryS Посмотреть сообщение
C
1
2
3
4
5
#define SIZE 5;
#define ARRSIZE (((SIZE)-1)/128+128)
 
char arr[ARRSIZE]
sizeof(arr);
sizeof(arr); покажет 128, хотя просил всего лишь 5
Потому что запрошено было не 5 а 128. Считаем вместе: (SIZE-1) = 4 ; 4/128 = 0 ; 0+128 = 128. Не считая, конечно, ошибки с точкой с запятой после пятерки, из-за которой этот код вообще не соберется.
Между прочим, как раз sizeof() в таком не ошибается, поскольку работает на уровне компиляции и смотрит размер типа данных, а не особенности выделения памяти в конкретной ОС.
0
Заблокирован
14.04.2019, 17:36 19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В более высокоуровневых языках размер массива можно определить через метод класса или что-то подобное.
Ну, дык, а я обратного и не утверждал.
Напиши себе класс и не морочай дядям головы.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
14.04.2019, 18:12 20
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Потому что запрошено было не 5 а 128.
хорошо, вот тебе реализация malloc от Keila для УСБ
C
1
2
3
4
5
void *USBD_static_malloc(uint32_t size)
{
  static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */
  return mem;
}
как видишь объем не зависит от запрашиваемого размера
и к тому же я сказал
Цитата Сообщение от ValeryS Посмотреть сообщение
пример надуманный
так что претензии типа
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
ошибки с точкой с запятой после пятерки, из-за которой этот код вообще не соберется.
отметаю
0
14.04.2019, 18:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2019, 18:12
Помогаю со студенческими работами здесь

Как узнать, сколько памяти занимает тот или иной элемент программы?
Товарищи, подскажите, пожалуйста, ответы на следующие вопросы: 1) Есть какие-либо средства...

Узнать сколько занимает памяти объект.
Здравствуйте. Кто нибудь в курсе, как можно узнать сколько &quot;весит&quot; экземпляр написанного мной...

Определить, сколько места занимает в динамической памяти массив
Заполнить массив целых чисел случайным образом. Размерность массива не ограничена (в рамках...

Определить, сколько места занимает в динамической памяти данный массив
Даны квадратная матрица A. Элементы вектора и матрицы задаются случайным образом. Размерность...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru