Получение размера данных Указателя

Это более анекдотично, чем реальный ответ...

у меня был подобный опыт с помощью сервера OpenLDAP и Samba. Я не мог найти, что библиотека действительно сделала то, что я хотел так, я прокрутил свои собственные классы помощника.

я использовал ldapbrowser для наблюдения то, что заполнили поля Samba, когда я создал пользователя "официальный" путь и и в основном копировал это.

единственной хитрой/нестандартной вещью LDAP было сумасшедшее шифрование пароля, которое мы имеем:

userPass:

"{MD5}" + Base64.encode64(Digest::MD5.digest(pass))

sambaNTPassword:

OpenSSL::Digest::MD4.hexdigest(Iconv.iconv("UCS-2", "UTF-8", pass).join).upcase

Для эти def authenticate(user, pass) функция я пытаюсь заставить LDAP связывать с доменом с помощью их учетных данных, если я ловлю исключение тогда отказавший вход в систему, иначе впускаю их.

5
задан systemsfault 20 October 2009 в 10:48
поделиться

5 ответов

Это не то, что вы можно делать на C, не сохраняя информацию самостоятельно. Вы создали массивы, поэтому в какой-то момент вы знали их размеры, вам просто нужно отслеживать их самостоятельно. Вы можете создать структуру данных, чтобы помочь вам, или просто тщательно поддерживать массив и информацию о размере без какой-либо структуры данных вообще.

Кроме того, ваш код использует strlen () для получения размера строки - убедитесь, что вы помните, что возвращаемый размер не будет включать завершающий нулевой символ ( '\ 0' ); размер строковой константы в памяти равен strlen (string) + 1 .

14
ответ дан 18 December 2019 в 05:49
поделиться

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

2
ответ дан 18 December 2019 в 05:49
поделиться

sizeof знает полный размер массива, только если он статически известен во время компиляции. Для указателя он вернет размер адреса памяти, то есть 4 в 32-битном, 8 в 64-битном.

Когда вы используете указатели, вы должны знать и отслеживать размер данных. он указывает на. Реализация языка не сделает этого за вас, как для массивов.

5
ответ дан 18 December 2019 в 05:49
поделиться

Стандартного способа сделать это не существует. Вы должны сохранить длину выделенной памяти в другой переменной или использовать «контейнер», который отслеживает за вас.

Некоторые платформы действительно имеют функции для определения количества байтов в распределении, например, Symbian как ] Функция AllocSize (ptr) .

3
ответ дан 18 December 2019 в 05:49
поделиться

Указатель не отслеживает количество объектов, выделенных после (первого) объекта, на который он указывает. Это потому, что он не может: malloc () просто возвращает адрес первого элемента, больше ничего.

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

5
ответ дан 18 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: