Определить длину массива 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 является статическим оператором и, следовательно, не может использоваться для возврата размера чего-либо, определенного во время выполнения.

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

Другие вопросы по тегам