определить длину массива calloc TCHAR (не длину строки)

У меня есть такой код:

TCHAR *sRes;
sRes = (TCHAR *) calloc(16384, sizeof(TCHAR));
DWORD dwRes = sizeof(sRes);

dwRes всегда 8, и, конечно, _tcslen (sRes) всегда 0.

Ищу 16384.


person JeffR    schedule 18.04.2011    source источник


Ответы (3)


Не существует поддерживаемого механизма для получения размера блока, выделенного с помощью malloc или calloc. Если вы вместо этого позвоните HeapAlloc, вы можете позвонить HeapSize после этого.

person bmargulies    schedule 18.04.2011
comment
Я читал, что HeapAlooc получит память из кучи процесса по умолчанию. calloc получит память из кучи CRT. Каковы последствия использования любого из них? - person JeffR; 19.04.2011
comment
Освободите память HeapAlloc с помощью HeapFree. Тоже подозреваю, что медленнее, но уже давно. - person bmargulies; 19.04.2011

В C нет способа получить размер блока памяти только по базовому адресу блока.

Но когда вы создали блок, вы знали его размер: просто сохраните его и используйте потом, когда вам нужно:

TCHAR *sRes;
DWORD dwRes = 16384 * sizeof (TCHAR);
sRes = calloc(16384, sizeof (TCHAR)); /* I prefer `sizeof *sRes` */

/* use `sRes` and `dwRes` as needed ... */

Также обратите внимание, что я удалил приведение из возвращаемого значения calloc. Трансляция здесь бесполезна и может скрыть ошибку.

person pmg    schedule 18.04.2011
comment
Но я получаю ошибку компилятора, если не использую ее. - person JeffR; 19.04.2011
comment
Тогда вы, вероятно, компилируете с помощью компилятора C ++. Я предпочитаю использовать компиляторы C для кода C, но я понимаю, что некоторым людям нравится компилировать код C с компиляторами C ++ для дополнительной (избыточной и, возможно, ошибочной) диагностики. - person pmg; 19.04.2011
comment
Да, я компилирую с помощью компилятора C ++. @Blagovest: Я использую Visual Studio 2008. Я получаю ошибку компилятора void *. - person JeffR; 19.04.2011

Операционная система и соответствующая реализация распределителя памяти отслеживают это число, но стандартного средства для получения этого значения в коде приложения нет.

sizeof является статическим оператором и, следовательно, не может использоваться для возврата размера чего-либо, определенного во время выполнения.

Ваш единственный вариант - создать настраиваемую структуру, в которой вы вручную сохраните как возвращаемый указатель, так и размер, который был выделен.

person Blagovest Buyukliev    schedule 18.04.2011