Определение кол-ва выделенной памяти Си\С++
Допустим есть указатель, этот указатель указывает на память выделенную для символов(извиняюсь что коряво, лень было формулировать), как можно узнать на сколько символов выделено памяти? Ее размер? (Си\С++)
Зависит от указателя... в паскаля, например, есть два способа выделить память, в одном из которых выделяется реально запрашиваемое количество байт, а в другом - на 4 больше. Эти 4 байта находятся перед указателем на выделенную область и содержат ее длину, уверен, в си есть что то подобное.
Цитата: 0nni
Зависит от указателя... в паскаля, например, есть два способа выделить память, в одном из которых выделяется реально запрашиваемое количество байт, а в другом - на 4 больше. Эти 4 байта находятся перед указателем на выделенную область и содержат ее длину, уверен, в си есть что то подобное.
мммм? С - это однако не паскаль. :) И причем здесь - зависит от указателя?
2Artem_3A по указателю никак. Можно получить размер элемента и умножить его на количество элементов - предварительно посчитав их.
Если же речь идет о символьном массиве - то используйте strlen
Цитата: Artem_3A
Допустим есть указатель, этот указатель указывает на память выделенную для символов(извиняюсь что коряво, лень было формулировать), как можно узнать на сколько символов выделено памяти? Ее размер? (Си\С++)
Никак. Нужно знать тип данных на которые указывает указатель.
Допустим.
Код:
struct point{int x,y;};
int x=3;
int y=4;
void* px = &x;
point *pp=px;
cout<<pp->x<<" "<<pp->y<<endl;
int x=3;
int y=4;
void* px = &x;
point *pp=px;
cout<<pp->x<<" "<<pp->y<<endl;
Result:
3 4;
А если убрать y
Result:
3 306999435;
Тип того.
Поэтому указатель занимает 4 байта и содердит просто адрес байта. А какой тип данных и тем более, сколько данный тип занимает - он не знает.
Единственно, что если строка символов, то ее окончание - байт с символом ('\0')
Т.е. при выделении
char *p="abc";
В памяти выделяется 4 байта 'a' 'b' 'c' '\0'
Цитата: kot_
мммм? С - это однако не паскаль. :) И причем здесь - зависит от указателя?
Я имел в виду от одного из этих способов выделения. Даже если в си такого нет, можно сделать ручками. И конечно понятно, что просто по указателю нельзя понять "каким" он является.
Ясно, всем спасибо, собственно я и предполагал что это невозможно, но учитывая что я далеко не все знаю решил спросить! Еще раз всем спасибо!