LoginSignup
1
0

More than 5 years have passed since last update.

UnsafeMutablePointer<T>を通してCの関数から値を受け取る際の注意

Last updated at Posted at 2017-11-15

値を設定する前にinitializeで初期化を行っておく。
これをしておかないと、deainitializeを呼び出したりした際にクラッシュする。

一応、
deinitializeメソッドのリファレンスでもinitializedされている必要があると記載がありますが、確実にクラッシュするわけではないので注意です。

main.swift
import libfoo

let fooPointer = UnsafeMutablePointer<Foo>.allocate(capacity: 1)

// 値を受け取る前にinitializeメソッドで初期化を行っておく
fooPointer.initialize(to: Foo())

// 値を受け取る
setFoo(fooPointer)

コメントにて、
@t-ae さんからUnsafeMutablePointer<T>ではなく、以下でも値を受け取ることができるとご教示頂きました。

main2.swift
var foo = Foo() 
setFoo(&foo)

上記のコードは、UnsafeMutablePointer<T>版の糖衣構文になっていますので、
initializeはまさにfoo変数宣言時に必要な初期化(var foo = Foo())であると考えられます。


一応C側のコードは以下のようなのを想定

foo.h
typedef struct {
        char* name;
        int age;
} Foo;

void setFoo(Foo* foo);
foo.c
void setFoo(Foo* foo) {
        foo->name = "tanaka";
        foo->age  = 10
}
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0