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