Cのポインター型のサイズをgolangで取得する

TL;DR

0をuintptrにキャストして使用する

unsafe.Sizeof(uintptr(0))

mallocに渡す

ptr := (**C.char)(C.malloc(C.size_t(unsafe.Sizeof(uintptr(0)))))

モチベーション

cgoでコードを書いていて、ポインターのサイズ分、マロックしたい。

公式 cgoによると、C.sizeof_Tにてサイズが取得できるとあるが、 ポインター型に対する記述がない。

ポインター型であるため以下のようにuintptrで確保すればいいと考えたが、コンパイルエラーになる

# compile error
ptr := (**C.char)(C.malloc(C.size_t(unsafe.Sizeof(uintptr))))

# type uintptr is not an expression

解決策

0をuintptrにキャストして使用する

他の解決策

事前に変数を宣言することによっても可能。

ただcで書かれたライブラリにより変数が確保されている場合は、 mallocのサイズ取得のためにしか使用せず冗長になるため避けたいところ。

var charptr *C.char
charptr2 := (**C.char)(C.malloc(C.size_t(unsafe.Sizeof(charptr))))