LINUX.ORG.RU

Вопрос знатонам C - alloc +sizeof


0

0

Привет всем!

Обнаружил странную вещь:

1.
char buf[100];
sizeof(buf) == 100;

2.
char *p = (char*)malloc(10);
sizeof(p) == 4 bytes;

Проверено под разными платформами (включая DOS),
НО МНЕ НУЖЕН РАЗМЕР, а не указатель.

Где грабли!

Спасибо.

Сергей


Во втором случае ты получаешь только размер самого указателя, а он 4 байта.

Havoc ★★★★
()

Об этом то и речь,
мне нужен РАЗМЕР а не указатель!

ssv
() автор топика

Во втором случае ты размер получить sizeof'ом не сможешь, потому что sizeof вычисляется во время компиляции.

justme
()

Труба я тоже хотел :-(
Есть функции которые дадут общий размер динамической памяти а вот
по указателю труба :-(
мож кто знает ? при дебаге так бы хотелось !
Хотя при нормальной реализации размер и ненадо знать он сам
высчитывается сам и realloc делает :-)

Aleks_IZA
()

Если там нет 0, то strlen(char *)

anonymous
()

sizeof это compile time информация, вместо которой компилер подставляет константу. malloc - это не конструкция компилера, поэтому он не знает на момент компиляции сколько памяти выделено. Вобщем sizeof работает только для статической памяти. А зачем это нужно ? Просто интересно. Как вариант предлагаю структуру, хранящую указатель и размер блока, обновляющийся при реаллокации.

timur
()
Ответ на: комментарий от Aleks_IZA

A tut bez kakogo popalo malloc-debuggera ne obojtis'. Ja wot horoshego ne nashel i sam napisal...

anonymous
()

Для чего это нужно:

Делаю SQL-запрос к базе, ответ кладу в буфер и обрабатываю.
Если размер ответа меньше текущего размера буфера - то память
не выделяю (процедура-то долгая)
Сейчас выделяю с очисткой каждый раз при запросе.

ssv
() автор топика

Я думаю, что сервер тебе где-то возвращает объем данных

Havoc ★★★★
()

Ну и сделайте структуру, хранящую и указатель, и размер блока (если это Вы выделяете память). Ну а если память выделяется в этой функции, то Вам IMHO и не нужно знать объем блока. Или я что-то не понимаю ? В любом случае, даже если бы существовала такая функция, вызывать ее накладнее, чем просто использовать для проверки член структуры (и обновлять его конечно).

timur
()

P.S. В первом случае имелась в виду функция SQL запроса, во втором - функция, возвращающая объем блока по указателю.

timur
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.