将结构数组从Swift传递到C时出现的奇怪问题

将结构数组从Swift传递到C时出现的奇怪问题,swift,Swift,我将结构数组从Swift传递到C函数。结构如下所示: struct Struct { int a; float b; float c; const char* d; const char* e; const char* f; const char* g; int h[4]; }; C函数的函数签名: void test(struct Struct* structs); 奇怪的是,当我在C函数中打印d时,它通常与我在Swift代码

我将结构数组从Swift传递到C函数。结构如下所示:

struct Struct {
    int a;
    float b;
    float c;
    const char* d;
    const char* e;
    const char* f;
    const char* g;
    int h[4];
};
C函数的函数签名:

void test(struct Struct* structs);

奇怪的是,当我在C函数中打印
d
时,它通常与我在Swift代码中设置的不同:通常是一个空字符串或一些垃圾。当我将
d
设置为很长的字符串时,它工作正常。其他字符串也被正确传递。这是结构对齐问题吗?

正如@MartinR所建议的,当我将字符串传递给结构的构造函数时,Swift在堆栈上创建一个临时的C字符数组,将字符串的数据复制到其中,并将其指针传递给构造函数。紧接着,char数组不再有效。下面是一个示例代码,演示了这一点:

let s = Struct(string: "string")
print(s.string) // Prints "string"
print("lol") // Overwrite the stack
print(s.string) // Prints "lol"

有关可能的解决方案,请参阅。

您需要显示实际的代码来演示该问题。如果这是一个对齐问题,我们可能需要更多详细信息。C语言中
int
float的
sizeof
alignof
是什么?实际的指针值是什么?您使用的是什么编译器,用于什么机器?如何在Swift代码中填充结构?我的猜测是,
char*
成员指向C字符串,这些字符串是从Swift字符串临时创建的,并且在调用C函数时已被释放或覆盖。@DanielH:Swift中的结构布局通常与C不同,但对于从C导入的结构,Swift保留布局(大小、对齐、填充)@MartinR我正在将字符串文本传递给结构的构造函数,即类似于
struct(“test”)
。但您的猜测似乎是正确的,C字符串被写入堆栈的任何内容覆盖。。。