Честно говоря, я не пользовался, но да, действительно можно.
var pointer: UnsafeMutableBufferPointer<UInt8>?
array.withUnsafeMutableBufferPointer(){ bp in
pointer = bp
}
guard pointer != nil else {return nil}
let structPointer = flipStringToStruct(pointer!.baseAddress , Int32(array.count))
В Swift можно вызвать функцию free и передать в нее любой указатель, но так как память выделяется в Си коде, я решил ее там и освобождать. Кроме того, если вы будете использовать эти функции на другом языке программирования, то вам все равно придется как то освобождать память.
почему freeSMemmory не может освободить и строку тоже?
Я так понимаю, что тут вопрос в том, почему «freeMemmory»(она принимает параметр с void*) не может также освободить и структуру? Она может. Отвечая на ваш вопрос, потому что функции freeSMemmory ждет указатель на структуру. Вы получите ошибку типа «Cannot convert value of type 'UnsafeMutableRawPointer' to expected argument type 'UnsafeMutablePointer?'». Хотелось обратить внимание на типы данных по указателю. Можно было и обойтись, согласен.
почему «memmory» а не memory?..
Ошибся.
зачем нужна длина строки в структуре? строка как была null-terminated, так и осталась
В этом конкретном случае, вы конечно же правы. Можно считать каждый символ и смотреть не '\0' ли он. Но если у вас есть массив байт, который не обязательно закрыт, размер данных пригодится.
зачем два раза выделять память в функции, которая возвращает структуру?
Вы про то, что можно написать что то типа:
structure->result = result;
и не освобождать ее внутри? Если да, то конечно можно.
На сколько я понял вы предлагаете что то такое?
В Swift можно вызвать функцию free и передать в нее любой указатель, но так как память выделяется в Си коде, я решил ее там и освобождать. Кроме того, если вы будете использовать эти функции на другом языке программирования, то вам все равно придется как то освобождать память.
Я так понимаю, что тут вопрос в том, почему «freeMemmory»(она принимает параметр с void*) не может также освободить и структуру? Она может. Отвечая на ваш вопрос, потому что функции freeSMemmory ждет указатель на структуру. Вы получите ошибку типа «Cannot convert value of type 'UnsafeMutableRawPointer' to expected argument type 'UnsafeMutablePointer?'». Хотелось обратить внимание на типы данных по указателю. Можно было и обойтись, согласен.
Ошибся.
В этом конкретном случае, вы конечно же правы. Можно считать каждый символ и смотреть не '\0' ли он. Но если у вас есть массив байт, который не обязательно закрыт, размер данных пригодится.
Вы про то, что можно написать что то типа:
и не освобождать ее внутри? Если да, то конечно можно.