D语言含静态数组结构体传递至C时数据异常问题求助
解决D语言结构体含静态数组传递给C时数据为空的问题
我来帮你排查这个问题!你遇到的情况是D和C之间结构体传递时数据没有正确初始化导致的,虽然结构体大小一致,但初始化方式不对会让内存里的数组值没有被正确写入。
问题根源
你的D代码里用vec3f v = vec3f(ar);来初始化结构体,但D语言中,默认的结构体构造函数并没有自动把传入的数组绑定到结构体的array成员上——这种写法其实没有正确完成成员赋值,导致结构体里的数组还是默认的零值,传递给C后自然输出全0。
解决方案
方案一:显式赋值结构体成员
直接创建结构体实例后,手动把数组赋值给它的array成员:
void test(){ float[3] ar = [1f,2f,3f]; vec3f v; v.array = ar; // 显式赋值成员 testVec3f(v); }
方案二:使用聚合初始化语法
用D的聚合初始化直接初始化结构体,确保数组被正确写入:
void test(){ // 方式1:直接初始化数组成员 vec3f v = {[1f,2f,3f]}; testVec3f(v); // 方式2:先定义数组再初始化 float[3] ar = [1f,2f,3f]; vec3f v2 = {ar}; testVec3f(v2); }
补充说明
你之前的结构体定义是完全没问题的——extern(C)已经保证了D的结构体和C的结构体布局完全一致(大小12字节也验证了这一点),核心问题就是初始化步骤没有正确把数组数据写入结构体的内存中。
内容的提问来源于stack exchange,提问作者Rulli
相关产品推荐
相关产品推荐

