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

时间:2017-12-21 17:36:33

标签: 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设置为一个非常长的字符串时,它可以正常工作。其他字符串也正确传递。这是一些结构对齐问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

有关可能的解决方案,请参阅https://stackoverflow.com/a/40121697/243225