Это более анекдотично, чем реальный ответ...
у меня был подобный опыт с помощью сервера 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 связывать с доменом с помощью их учетных данных, если я ловлю исключение тогда отказавший вход в систему, иначе впускаю их.
Это не то, что вы можно делать на C, не сохраняя информацию самостоятельно. Вы создали массивы, поэтому в какой-то момент вы знали их размеры, вам просто нужно отслеживать их самостоятельно. Вы можете создать структуру данных, чтобы помочь вам, или просто тщательно поддерживать массив и информацию о размере без какой-либо структуры данных вообще.
Кроме того, ваш код использует strlen ()
для получения размера строки - убедитесь, что вы помните, что возвращаемый размер не будет включать завершающий нулевой символ ( '\ 0'
); размер строковой константы в памяти равен strlen (string) + 1
.
Указатель указывает только на то, где начинаются данные. Ему ничего не известно о размере данных.
sizeof
знает полный размер массива, только если он статически известен во время компиляции. Для указателя он вернет размер адреса памяти, то есть 4 в 32-битном, 8 в 64-битном.
Когда вы используете указатели, вы должны знать и отслеживать размер данных. он указывает на. Реализация языка не сделает этого за вас, как для массивов.
Стандартного способа сделать это не существует. Вы должны сохранить длину выделенной памяти в другой переменной или использовать «контейнер», который отслеживает за вас.
Некоторые платформы действительно имеют функции для определения количества байтов в распределении, например, Symbian как ] Функция AllocSize (ptr)
.
Указатель не отслеживает количество объектов, выделенных после (первого) объекта, на который он указывает. Это потому, что он не может: malloc ()
просто возвращает адрес первого элемента, больше ничего.
Следовательно, нет способа узнать размер динамически выделяемого массива. Вы должны сами следить за этим.