1

在我调用 C 函数的 Go 程序中,我可以成功地intptrdiff_t. (有点令人担忧的是,即使int8Go 类型对于任何现代架构来说都太小了,但也会成功编译。)但是*int*ptrdiff_t产生编译器错误: cannot convert <varname> (type *int) to type *_Ctype_ptrdiff_t. 唯一允许成功编译的类型是int64. 我意识到我可以将我的变量声明为 (*)C.ptrdiff_t 但我想了解相应的 Go 类型以及 Go 编译器在这种情况下的意外行为?

4

1 回答 1

2

ptrdiff_t 是特定大小的整数类型。当您将另一个整数类型转换为 ptrdiff_t 时,编译器会重新调整整数的大小。换句话说,它改变了旧整数的内存表示以匹配新类型。然后将这个新表示放在内存中的不同位置。

指针是内存中的一个位置。因此,您只能转换为指向相同内存布局的类型。int64 与 ptrdiff_t 具有相同的大小,因此内存表示相同,并且可以自由转换指针。

如果您希望转换任意整数类型,您需要首先更改其在内存中的表示形式,并通过将其分配给变量并获取其指针来为其提供新位置。

newtype := ptrdiff_t(oldInt)
pnewtype := &newtype
于 2014-01-19T01:46:07.933 回答