Определить размер массива по указателю
Размер массива по указателю
Не уверен, что всё правильно понимаю. Про "new" пишут, что оно выделяет необходимое количество.
Определить размерность массива по указателю на него
Дано: template< typename T > void info( T * x ) и int a; info( a ); int b; info( b );.
Узнать размер массива по указателю
Есть код: #include <stdio.h> #include <math.h> #include <string.h> void printArrrSize(char.
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
каким-нибудь непереносимым и хачным способом можно.
стандартным — нет.
Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
1 2 3 4 5 6 7
#include int main(){ int * p=new int[3213]; std::cout(_msize(p)/sizeof(*p)); delete [] p; return 0; }
Но это только VS.
Регистрация: 31.05.2012
Сообщений: 210
Записей в блоге: 2
ты не поверишь — никак.
поэтому во все нормальные функции размеры передают.
или же вместо указателей массивы используют — тогда через sizeof
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
Спасибо большое за ответы. Тема исчерпана.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Размер строки по указателю на неё
int Size(char* text) < return size; // надо вычислить >Size("hello"); Я передаю в.
Где хранится размер памяти, которая выделена указателю?
Поясню вопрос. Когда выделяем память указателю, то указываем размер: float *ptrarray = new.
Узнать размер памяти по указателю с помощью IntPtr.Size
Создаю объект IntPtr contourVs = CvInvoke.cvCreateMemStorage(0); //и выполняю с ним несколько.
Написать функцию, которая по указателю принимает одномерный массив и его размер.
Здоров всэм. памагите ришыти задачу №1 Написати функцію, яка по вказівнику.
Узнать размер массива по указателю
Всегда выодится 8. Не могу понять почему. В нете пишуть мутно либо — нельзя.
Так все-таки, можно узнать размер массива по указателю?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Узнать размер памяти по указателю с помощью IntPtr.Size
Создаю объект IntPtr contourVs = CvInvoke.cvCreateMemStorage(0); //и выполняю с ним несколько.
Размер массива по указателю
Не уверен, что всё правильно понимаю. Про "new" пишут, что оно выделяет необходимое количество.
Определить размер массива по указателю
Собственно вопрос в следующем: можно ли определить размер выделенного динамически массива по.
Ушел с форума
16470 / 7433 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
Сообщение от animator404
Всегда выодится 8. Не могу понять почему.
Массив при передаче в функцию вырождается в указатель.
Т.е. «sizeof (args)» внутри printArrrSize случае всегда будет равен «sizeof (void *)».
Сообщение от animator404
Так все-таки, можно узнать размер массива по указателю?
Никак. Язык не предоставляет такой возможности.
21275 / 8292 / 637
Регистрация: 30.03.2009
Сообщений: 22,656
Записей в блоге: 30
Сообщение от animator404
Так все-таки, можно узнать размер массива по указателю?
В таких случаях есть два стандартных способа:
1. Размер передавать отдельным параметром
2. Последним элементом массива записывать специальное заранее оговоренное значение, которое функция будет трактовать как конец массива (при обходе всех элементов, начиная с первого)
В большинстве случаев пользуется первым
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как узнать значение массива по указателю во время отладки?
А как посмотреть значения массива, если есть только указатель на его первый элемент? Например: .
Узнать размер массива
есть 2 указателя на первый элемент массива и указатель на элемент после последнего можно ли.
Как узнать размер массива?
Имею функцию template <typename T> int funk(T mas, T element) < //kod >
Узнать размер динамического массива
Здравствуйте. Пытаюсь сделать динамический массив и вывести его размерность. Выводится размерность.
Как узнать размер массива по указателю c
Full Member
Рейтинг (т): 5
Можно ли как нибудь узнать размер массива по указателю? Например:
int x[15];
cout // Дает размер массива ‘x’
а как узнать размер массива если:
int x[15];
int *y = x;
. ; // А размер занимаемый ‘x’ по ‘y’ узнать возможно?
Сообщ. #2 , 28.04.04, 21:33
Unregistered
Сообщ. #3 , 28.04.04, 21:42
Рейтинг (т): 4
По указателю — нельзя никак.
Сообщ. #4 , 28.04.04, 23:08
Full Member
Рейтинг (т): 5
2Guest: sizeof(*y)- даст размер первого элемента массива
спасибо за ответ
Сообщ. #5 , 29.04.04, 06:49
Unregistered
Цитата UNV @ 29.04.04, 01:42
По указателю — нельзя никак.
Повторяюсь (см этот топик) — не недо быть таким категоричным.
Сообщ. #6 , 29.04.04, 08:11
Рейтинг (т): 13
Цитата Adil @ 29.04.04, 09:49
Повторяюсь (см этот топик) — не недо быть таким категоричным.
Нельзя никак. Все описанные в упомянутом топике способы — сильно зависят от реализации компилятора/RTL и не являются переносимыми.
А что мешает использовать в качестве динамического массива std::vector<> ?
Сообщ. #7 , 29.04.04, 08:17
Рейтинг (т): 37
CheshireCat, 29.04.04, 11:11
А что мешает использовать в качестве динамического массива std::vector<> ?
Если бы ты внимательно прочитал топик, то увидел бы, что этот вариант предлагался, но вопрос был не о том, как лучше/удобнее/отпимальнее/т.п. хранить массив данных, а как узнать размер!
Сообщ. #8 , 29.04.04, 09:28
Рейтинг (т): 37
LuciferBot, 29.04.04, 12:11
Как-то подобная тема поднималась. Пришли кажись к следущему: если массив динамический, то по адресу начало массива-4 байта лежит long — скока памяти выделено.
Вовсе не обязательно, это зависит от компилятора.
Сообщ. #9 , 29.04.04, 09:49
Рейтинг (т): 506
Народ, может не надо чесать правое ухо левой пяткой? Стандартного способа узнать размер массива по указателю (и вообще — на массив ли указывает указатель) не существует. Можно шаманить для каждого конкретного компилятора и конфигурации сборки (release/debug etc), но это все равно будет шаманством. Лучше полизоваться стандартными сресдвами (типа std::vector, std::valarray и т. п.) и не париться.
Сообщ. #10 , 29.04.04, 14:05
Full Member
Рейтинг (т): 5
В общем значит как такового способа нет (если не брать в расчет знание того где какой компайлер хранит эту инфу)
Всем спасибо за предложенные варианты
Сообщ. #11 , 29.04.04, 14:14
Unregistered
Цитата CheshireCat @ 29.04.04, 12:11
Нельзя никак. Все описанные в упомянутом топике способы — сильно зависят от реализации компилятора/RTL и не являются переносимыми.
Нет, эта категоричность суждений меня просто умиляет.
«Способы есть, но они плохие, значит их нет совсем»
Но, в конце-концов-то, оператор delete[] или ф-ция free любого си-шного компилятора знают, сколько байт положено по указателю, и этим бессовестно пользуются. Ну так если человек пишет программу, точно зная, что не будет ее ни куда переносить, почему бы и не воспользоваться таким же бессовестным образом?
И вообще, у меня, как ярого борца за переносимость кода, такое предложение — давайте будем последовательны и пойдем до конца: создадим новый язык, который будут понимать все компиляторы — от джавы до фортрана — даешь полную переносимость кода.
Сообщ. #12 , 29.04.04, 14:24
Unregistered
А что будет если кто-то попытаеться удалить стековый массив по указателю на первый его член?(я имею ввиду массив типа int arr[10]
Сообщ. #13 , 29.04.04, 14:28
Рейтинг (т): 640
Adil, 29.04.04, 17:14
Но, в конце-концов-то, оператор delete[] или ф-ция free любого си-шного компилятора знают, сколько байт положено по указателю, и этим бессовестно пользуются.
Компилятор знает куда и что он сам положил. Где гарантия, что какой-то трюк с одной версией компилятора будет работать с другой версией? Не говоря уж о других компиляторах. А где гарантия, что компилятор всегда пользуется одним и тем же способом?
Сообщ. #14 , 29.04.04, 14:56
Рейтинг (т): 13
Цитата Adil @ 29.04.04, 17:14
Ну так если человек пишет программу, точно зная, что не будет ее ни куда переносить, почему бы и не воспользоваться таким же бессовестным образом?
Потому, что если «крутой программер» Вася Пупкин пишет одноразовую программулину исключительно для себя, любимого — это еще ладно. А вот что произойдет, ежли он в коммерческом программном продукте такое напишет? А потом уволится (заболеет, сломает руку/ногу/голову, уедет в отпуск на Гавайи, попадет под трамвай. остальное добавить по вкусу!), и программулину передадут другому программисту (ну, или коллективу программистов)? А он (они, оне, руководство, Петя Пяточкин. ) решат использовать другую версию компилятора/RTL. Ась?
Масса трудновыводимых глюков в программе — это еще самое малое, что последует.
Сообщ. #15 , 29.04.04, 15:12
Unregistered
Цитата dimedrol @ 29.04.04, 18:24
А что будет если кто-то попытаеться удалить стековый массив по указателю на первый его член?(я имею ввиду массив типа int arr[10]
А тоже самое, что и не стековый массив — static int arr[10], например
А гарантия — вообще понятие относительное. Ни кто ведь не дает гарантии, что с завтрашнего дня, к примеру, программистов на С не будут отстреливать на улицах?
Раз кому-то хочеться завязываться на специфику конкретного компилятора конкретной версии — то, имхо, это его право. Я не призываю использовать вышеописанный способ, сам им никогда не пользовался, но суть то вопроса была — «можно или нельзя?» и, имхо, суть ответа — «можно», ну, если угодно почтеннейшей публике, «можно, если осторожно», но уж никак не «нельзя, потому что это неприлично», в смысле переносимости кода
Добавлено в 29.04.04, 15:20 :
Цитата CheshireCat @ 29.04.04, 18:56
А вот что произойдет, ежли он в коммерческом программном продукте такое напишет? А потом уволится (заболеет, сломает руку/ногу/голову, уедет в отпуск на Гавайи, попадет под трамвай. остальное добавить по вкусу!), и программулину передадут другому программисту (ну, или коллективу программистов)? А он (они, оне, руководство, Петя Пяточкин. ) решат использовать другую версию компилятора/RTL. Ась?
Масса трудновыводимых глюков в программе — это еще самое малое, что последует.
А тогда начальство будет следить за его здоровьем, давать деньги на такси, чтоб на трамваях не ездил, десять раз подумает, прежде чем его уволить или сменить версию компилятора.
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Общие вопросы
- Следующая тема
Как sizeof вычисляет размер массива?
Как sizeof вычисляет размер массива, если передавая функции имя массива, по факту передается указатель на первый элемент, в данном случае sizeof получает указатель на int (sizeof (int) == 4). Откуда функция узнает количество элементов? По идеи при передаче sizeof указателя, должен возвращаться размер этого указателя (в моем случае 8).
sizeof(&arr[0]) == 8.
Как это все работает если // &arr[0] == arr
Выводят один и тот же адрес:
printf("%p\n", &arr[0]); printf("%p\n", arr);
А вот если вызывать sizeof с этими значениями то будет разные результаты.
printf("%zd\n", sizeof(&arr[0])); // Выводится размер указателя printf("%zd\n", sizeof(arr)); // Выводится размер всего массива, хотя и то и то являются адресами первого элемента
- Вопрос задан более трёх лет назад
- 8979 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1
Developer, ex-admin
sizeof — это не функция (хоть и выглядит похоже) — это операция взятия размера.
sizeof всегда вычисляется на этапе компиляции, т.е. в исполняемом файле вместо вызова sizeof уже будет вычисленная константа.
Когда компилятор знает размер массива, как в вашем примере, он вернет полный размер массива.
Но если передать в sizeof произвольный указатель (именно указатель, а не статический массив), он вернет размер указателя.
Статический массив — это не указатель. Указатель — на этапе выполнения занимает в памяти место для хранения адреса. Статический массив занимает в памяти место для хранения данных массива.
Поэтому статический массив — это не указатель. Хотя часто компилятор работает с именем статического массива как с указателем.
Ответ написан более трёх лет назад
Нравится 19 8 комментариев
dandropov95 @dandropov95 Автор вопроса
res2001 Вот это вот и путает что часто имя массива является указателем. В одном случае это указатель на первый элемент, в другом случае имя является просто именем статического массива
Имя массива не часто — оно всегда является указателем на первый элемент. Но Вас запутало то, что sizeof — не функция. sizeof -это число 🙂 Его аргументом являются только полностью определенные типы, поэтому еще на этапе компиляции sizeof(arr) превратится в sizeof(int) * SIZE. А вот sizeof(*(arr + 0)) — это явный запрос адреса, то есть если перевести на «человеческий» это будет — «хочу узнать размер ячейки, в которой записан адрес элемента arr+0»