Есть ли способ найти размер памяти Dynami c как sizeof facelity? - PullRequest
1 голос
/ 25 мая 2020

Я ищу что-то, что дает мне размер, который берется указателем символа str.

int main()
{
    char * str = (char *) malloc(sizeof(char) * 100);
    int size = 0;
    size  = /* library function or anything use to find size */
    printf("Total size of str array - %d\n", size);
}

Я хочу доказать, что объем памяти составляет 100 байт. Кто-нибудь знает об этом?

Ответы [ 3 ]

2 голосов
/ 25 мая 2020

Необработанный указатель знает только, что он указывает на единственный элемент своего типа. Если то, на что он указывает, оказывается частью массива, указатель не знает, и нет никакого способа получить от него эту информацию.

Вместо этого вы хотите использовать типы, которые do знать их размер, например; std::string, std::array или std::vector.

1 голос
/ 25 мая 2020
  1. Стандарты C и C ++ не предоставляют способа получить по адресу объем памяти, запрошенный при вызове malloc, который вернул этот адрес.

  2. Некоторые реализации C или C ++ предоставляют способ получить объем памяти, который был предоставлен по заданному адресу, например malloc_size. Предоставленная сумма может быть больше запрошенной.

  3. Если в памяти содержится строка, которая представляет собой массив символов, оканчивающихся нулевым символом, вы можете определить длину строки путем подсчета символов до нулевого символа. Эта функция предоставляется стандартной функцией strlen. Эта длина отличается от выделенного пространства, если, конечно, строка не заполняет пространство.

0 голосов
/ 25 мая 2020

Нет (хорошего, стандартного, переносимого) способа определить по одному только значению указателя, является ли он первым элементом массива или нет, и сколько элементов следует за ним. Эту информацию нужно отслеживать отдельно.

Если вы пишете на C ++, не делайте своего собственного управления памятью, если можете. Используйте стандартный тип контейнера, например std::vector или std::map (или std::string для текста). Если вы должны самостоятельно управлять памятью, используйте операторы new и delete вместо библиотечных функций *alloc и free и оберните класс вокруг этих операций, который также отслеживает сколько элементов было выделено (которое, как и std::vector и std::map, возвращается с помощью метода size() только для чтения).

...