我有一个字符串变量
string pr00("")
我想调用方法fun1
fun1(demo *dm)
演示定义如下
typedef struct
{
char pr00[100];
}demo;
将此方法称为
是安全的fun1((demo*)pr00);
谢谢,BR
答案 0 :(得分:2)
不,这是不安全的。因为std::string
的成员与demo
不同。
但您可以定义构造函数以隐式转换std::string
到demo
类型。
#define MAX_SIZE 100
struct demo
{
demo(const std::string& str)
{
memset(pr00, 0, MAX_SIZE);
if (str.length() < MAX_SIZE)
{
strncpy(pr00, str.c_str(), str.length());
pr00[str.length()] = 0;
}
}
char pr00[MAX_SIZE];
};
现在您可以编写代码:
std::string name("hello world");
demo d(name);
答案 1 :(得分:1)
不,fun1((demo*)pr00);
是未定义的行为。您需要将pr00
中的字符(最多100个)复制到demo
并将指针传递给fun1
demo dm;
std::copy_n(pr00.data(), std::min(100, pr00.size()), dm.pr00);
fun1(&dm);
答案 2 :(得分:0)
我假设<input type="text" class="form-control" name="fname">
表示func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// BEFORE ANIMATION CONTEXT
UIView.animate(withDuration: 0.75, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
// ANIMATION TILL END CONTEXT
self.layoutIfNeeded
}, completion: {
// AFTER ANIMATION CONTEXT
})
}
。
这不仅不安全,而且无效。问题有string
。
这是尝试将结构强制转换为指针。非法,如果您的编译器具有允许的设置,请将其关闭。
关于std::string
,有一个更有趣的问题。
请注意fun1((demo*)pr00)
获取fun1((demo*)&pr00)
的地址。
它仍然是未定义的行为,但至少它是在不相关的结构之间转换指针。
您可以定义&
并致电pr00
,但void fun2(char*cp)
内fun2((char*)&pr00)
可以安全地执行的操作有很多限制。
你不应该对cp
的布局做任何假设,所以你应该'访问fun2()
(特别是不要写它),假设你可以找到什么。