2016-04-08 22 views
1

cFunctionCall b içeriyor ve dize içeriğini GO dizesine alabiliyorum. Ancak, bellek ayırmamın (satır # 1) etkin olmadığını düşünüyorum.Boş CString nasıl ayrılır?

b := C.CString(strings.Repeat(" ", 50)) 
defer C.free(unsafe.Pointer(b)) 
C.cFunctionCall(b, 50) 
rs := C.GoString(b) 
log.Printf("rs: '%v'\n", rs) 

cevap

1

bunu ekstra tahsisi olmadan başlatıldı ve Go kopyalamak istiyorsanız, bir C dizgesi üzerinde strings.Repeat işlevi uygulamak gerekir: o kadar

func emptyString(size int) *C.char { 
    p := C.malloc(C.size_t(size + 1)) 

    pp := (*[1 << 30]byte)(p) 
    bp := copy(pp[:], " ") 
    for bp < size { 
     copy(pp[bp:], pp[:bp]) 
     bp *= 2 
    } 
    pp[size] = 0 
    return (*C.char)(p) 
} 

gerek yoksa başlatılabilir, sadece işaretçiyi malloc/calloc yapabilir ve işlevinize iletebilirsiniz. Bu defalarca denilen ve aslında bir performans sorun teşkil ediliyor sürece

b := C.malloc(50) // or 51 if the depending on what size your function is expecting 
defer C.free(unsafe.Pointer(b)) 
C.cFunctionCall((*C.char)(b), 50) 

, zaten var ve uğraşmak zorunda C kod miktarını azaltmak neyi kullanıyoruz.

+0

Teşekkürler. malloc örneği ilgilendi. –