>  기사  >  백엔드 개발  >  Go에서 `const char*` 문자열의 C 배열에 올바르게 액세스하는 방법은 무엇입니까?

Go에서 `const char*` 문자열의 C 배열에 올바르게 액세스하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-19 22:08:03910검색

How to Correctly Access a C Array of `const char*` Strings from Go?

Go에서 const char *의 C 배열에 액세스

const char Go에서 cgo를 사용합니다. 특히 C 배열의 문자열이 있고 이를 색인화하여 배열 항목을 Go 문자열로 변환하려고 합니다.

잘못된 접근 방식

현재 코드는 포인터 산술을 사용하여 이를 수행하려고 시도합니다.

myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
그러나 이 접근 방식은 문자를 따라 인덱싱하기 때문에 올바르지 않습니다. 배열이 아닌 문자열의 것입니다. 결과적으로 전체 문자열 대신 각 문자열의 처음 몇 문자를 얻게 됩니다.

올바른 해결책

C 배열에 올바르게 액세스하려면 더 안전하고 먼저 Go 슬라이스로 변환하는 것이 더 편리합니다.

import "unsafe"

const arraySize = 3

cStrings := (*[arraySize]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]

for _, cString := range cStrings {
    fmt.Println(C.GoString(cString))
}
C 배열을 Go 슬라이스로 변환하면 반복할 수 있습니다. 해당 요소를 덮어쓰고 C.GoString()을 사용하여 각 요소를 Go 문자열로 변환합니다.

샘플 출력

이 접근 방식을 사용하면 C에서 전체 문자열을 가져올 수 있습니다. 배열(다음 샘플 출력에 표시됨):

위 내용은 Go에서 `const char*` 문자열의 C 배열에 올바르게 액세스하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.