У меня есть такой код:
TCHAR *sRes;
sRes = (TCHAR *) calloc(16384, sizeof(TCHAR));
DWORD dwRes = sizeof(sRes);
dwRes всегда 8, и, конечно, _tcslen (sRes) всегда 0.
Ищу 16384.
У меня есть такой код:
TCHAR *sRes;
sRes = (TCHAR *) calloc(16384, sizeof(TCHAR));
DWORD dwRes = sizeof(sRes);
dwRes всегда 8, и, конечно, _tcslen (sRes) всегда 0.
Ищу 16384.
Не существует поддерживаемого механизма для получения размера блока, выделенного с помощью malloc или calloc. Если вы вместо этого позвоните HeapAlloc
, вы можете позвонить HeapSize
после этого.
В C нет способа получить размер блока памяти только по базовому адресу блока.
Но когда вы создали блок, вы знали его размер: просто сохраните его и используйте потом, когда вам нужно:
TCHAR *sRes;
DWORD dwRes = 16384 * sizeof (TCHAR);
sRes = calloc(16384, sizeof (TCHAR)); /* I prefer `sizeof *sRes` */
/* use `sRes` and `dwRes` as needed ... */
Также обратите внимание, что я удалил приведение из возвращаемого значения calloc
. Трансляция здесь бесполезна и может скрыть ошибку.
Операционная система и соответствующая реализация распределителя памяти отслеживают это число, но стандартного средства для получения этого значения в коде приложения нет.
sizeof
является статическим оператором и, следовательно, не может использоваться для возврата размера чего-либо, определенного во время выполнения.
Ваш единственный вариант - создать настраиваемую структуру, в которой вы вручную сохраните как возвращаемый указатель, так и размер, который был выделен.