Определить длину массива calloc из TCHAR (не длина строки)
У меня есть этот код:
TCHAR *sRes;
sRes = (TCHAR *) calloc(16384, sizeof(TCHAR));
DWORD dwRes = sizeof(sRes);
dwRes всегда равно 8, и, конечно, _tcslen(sRes) всегда равно 0.
Я ищу 16384.
3 ответа
Не существует поддерживаемого механизма для получения размера блока, выделенного с помощью 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
является статическим оператором и, следовательно, не может использоваться для возврата размера чего-либо, определенного во время выполнения.
Единственный вариант - создать собственную структуру, в которой вы вручную сохраняете как возвращаемый указатель, так и размер, который был выделен.