Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays D样式数组到C样式数组_Arrays_Pointers_D - Fatal编程技术网

Arrays D样式数组到C样式数组

Arrays D样式数组到C样式数组,arrays,pointers,d,Arrays,Pointers,D,我正在用D创建一个窗口,而CreateWindowA函数需要指向字符的指针,基本上是C字符数组 如何将D样式数组(char[])转换为C样式数组(char*)?您可以获取D数组的ptr字段。和length字段来获取长度 但是,如果您需要一个C样式的字符串,那么您需要一个方法来添加空终止符并返回指向第一个字符的指针k如果api没有创建自己的副本来操作,则保留对它的引用,以避免GC挂起指针您抓取D数组的ptr字段。和length字段来获取长度 但是,如果您需要一个C样式的字符串,那么您需要一个方法来

我正在用D创建一个窗口,而
CreateWindowA
函数需要指向字符的指针,基本上是C字符数组


如何将D样式数组(
char[]
)转换为C样式数组(
char*
)?

您可以获取D数组的
ptr
字段。和
length
字段来获取长度


但是,如果您需要一个C样式的字符串,那么您需要一个方法来添加空终止符并返回指向第一个字符的指针
k
如果api没有创建自己的副本来操作,则保留对它的引用,以避免GC挂起指针

您抓取D数组的
ptr
字段。和
length
字段来获取长度


但是,如果您需要一个C样式的字符串,那么您需要一个方法来添加空终止符并返回指向第一个字符的指针
k
eep引用它,如果api没有创建自己的副本来操作,以避免GC挂起指针

要查看的两个函数是正常和

toStringz
string
转换为
immutable(char)*
,您可以将其传递给采用
const char*
的C函数。如果它可以确定
字符串
以null结尾(这通常只是字符串文本的情况,它的结尾有一个null终止符),那么它不会分配,只会使用
字符串
ptr
属性,但在大多数情况下,它会分配

toUTFz
将从任何字符串类型转换为任何字符指针类型。它可能最常用于转换为Windows的
const(wchar)*
,因为Windows的所有
W
函数都采用UTF-16,但它也可用于转换为
char*
——例如
str.toUTFz!(char*)()
。像
toStringz
,如果它能确定它是不必要的,它将尝试不分配,但它几乎总是必要的


现在,对于您的特定情况,您正在尝试在Windows中使用一个
A
函数。这几乎总是一个坏主意,我强烈建议不要这样做。使用
toUTFz
字符串
转换为
const(wchar)*
并将其传递给
CreateWindowW
。顺便说一句,
A
函数的唯一优点是它们与Win2K之前的版本一起工作。他们的其他一切都更糟。但是,如果出于某种原因,您坚持使用
A
函数,那么您将不得不使用,因为
A
函数不采用UTF-8,而是采用“Windows 8位字符集”,并且
toMBSz
会将字符串转换为该格式。

要查看的两个函数是正常的

toStringz
string
转换为
immutable(char)*
,您可以将其传递给采用
const char*
的C函数。如果它可以确定
字符串
以null结尾(这通常只是字符串文本的情况,它的结尾有一个null终止符),那么它不会分配,只会使用
字符串
ptr
属性,但在大多数情况下,它会分配

toUTFz
将从任何字符串类型转换为任何字符指针类型。它可能最常用于转换为Windows的
const(wchar)*
,因为Windows的所有
W
函数都采用UTF-16,但它也可用于转换为
char*
——例如
str.toUTFz!(char*)()
。像
toStringz
,如果它能确定它是不必要的,它将尝试不分配,但它几乎总是必要的


现在,对于您的特定情况,您正在尝试在Windows中使用一个
A
函数。这几乎总是一个坏主意,我强烈建议不要这样做。使用
toUTFz
字符串
转换为
const(wchar)*
并将其传递给
CreateWindowW
。顺便说一句,
A
函数的唯一优点是它们与Win2K之前的版本一起工作。他们的其他一切都更糟。但是,如果出于某种原因,您坚持使用
A
函数,那么您将不得不使用,因为
A
函数不采用UTF-8,而是采用“Windows 8位字符集”,并且
toMBSz
将字符串转换为该格式

“具有缓冲区溢出风险的代码可以将指针从数组中吓跑(通过使用
arr.ptr
)“-来自官方教程,在谷歌搜索2分钟后发现。@H2CO3这通常是个坏主意,因为D字符串不是以null结尾的,而C字符串通常是以null结尾的。”。将
ptr
传递给C函数仅在它也需要长度时有效,并且不会在传递的数组中查找空终止符。@JonathanMDavis完全正确(但传递显式长度通常是更好的主意…)“喜欢冒缓冲区溢出风险的代码可以将指针从数组中吓跑(通过使用
arr.ptr
)“-来自官方教程,在谷歌搜索2分钟后发现。@H2CO3这通常是个坏主意,因为D字符串不是以null结尾的,而C字符串通常是以null结尾的。”。将
ptr
传递给C函数仅在它也接受长度时有效,并且不会在传递的数组中查找空终止符。@JonathanMDavis完全正确(但传递显式长度通常是更好的主意…)通常,这是正确的。但是,对于Windows
A
函数,它不是,因为它们使用
char
,而不使用UTF-8。对于它们,您需要
std.windows.charset.toMBSz
。一般来说,这是正确的。但是,对于Windows
A
函数,它不是,因为它们使用
char
,而不使用UTF-8。您需要
std.windows.charset.toMBSz
,这就是我使用的原因