Длина C (const char *) одинакова, но содержимое отличается в Swift

#c #ios #objective-c #swift

#c #iOS #objective-c #swift

Вопрос:

У меня есть указатель на функцию в C , который имеет значение

      function_pointer(const char*, unsigned long int){
    
           const char arr[] = {1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e', 'f', 'g'};

             for (int i = 0; i<12; i  ){
                  std::cout<<int(arr[i])<<" ";
              }

           SwiftCallingFunction(arr, 12);
    }
 

На стороне Swift я могу получить доступ как

     func function_pointer_swift (frameData: UnsafePointer<Int8>?, frameSize: UInt){

            let buffer = UnsafeBufferPointer(start: frameData.unsafelyUnwrapped, count: Int(frameSize));
            let a = Array(buffer)
                 for element in a {
                print(Int(element), terminator:" ")
             }

} 
 

Насколько я знаю, до сих пор все в порядке:

UnsafePointer -> Неизменяемый (поскольку char является const, это нормально) и преобразование в Int8 из-за char (знаковое 8-битное целое число val).

Как только я печатаю массив на C и Swift несколько раз, я получаю одно и то же значение несколько раз совершенно по-разному.

Например:

Он печатает (как и ожидалось):

 CPP Prints   -> 1 2 3 4 5 97 98 99 100 101 102 103 
Swift Prints -> 1 2 3 4 5 97 98 99 100 101 102 103 
 

Но, однако, несколько раз

 CPP Prints   -> 1 2 3 4 5 97 98 99 100 101 102 103 
Swift Prints -> -16 -57 -32 -127 2 0 0 0 40 -106 -127 13 
 

CPP печатает всегда одно и то же содержимое, но swift не совпадает, он печатает что-то вроде следующего:

 -16 -57 -32 -127 2 0 0 0 40 -106 -127 13 

1 2 3 4 5 97 98 99 100 101 102 103 

16 -64 -32 -127 2 0 0 0 40 -106 -127 13 

0 93 12 0 0 0 0 0 40 -106 -127 13 

-128 -44 -60 2 1 0 0 0 100 101 102 103 
 

Комментарии:

1. Я вижу, что функция CPP не выводит массив, переданный в параметрах. Может быть, он работает неправильно, а не в версии swift?

2. Я передаю как arr на самом деле, если вы посмотрите function_pointer, это функция обратного вызова. SwiftCallingFunction(arr, 12); И я могу получить доступ к чему-то правильному, иногда неправильному, поэтому я не думаю, что это ошибка параметра

3. Вам нужно включить Address Sanitizer , Detect use of stack after return , Undefined behaviour Sanitizer в Diagnostics

4. Я предполагаю, что это цель отладки, но, однако, после этого все работает нормально. Я действительно смущен тем, как эта ошибка устраняется, поскольку это инструмент отладки. Но это работает только для моих статических данных, которые «1 2 3 4 5 97 98 99 100 101 102 103 » Но если я использую динамический тип вместо него, это иногда неправильно, иногда неправильно, и ошибки на стороне памяти нет. Чтобы убедиться, что он работает, я просто изменил его размер, и он говорит, что переполнение кучи, поэтому инструмент отладки в порядке, но если ошибка / ошибка происходит, это мне ничего не говорит. Но это полезно знать для следующих попыток. Спасибо

5. Я изменил char * на char [] через strncpy, теперь я получаю тот же результат. Спасибо 🙂