C++ 将地址插入集合时,集合的大小比预期的小
我要一号的。不是应该是4点吗?我将整数的地址插入到集合中C++ 将地址插入集合时,集合的大小比预期的小,c++,set,C++,Set,我要一号的。不是应该是4点吗?我将整数的地址插入到集合中 void func(set<int*>& s1, set<int*>& s2, int a) { s1.insert(&a); s2.insert(&a); } int main() { set<int*> s1, s2; int a = 1, b = 2, c = 3, d = 4; func(s1, s2, a);
void func(set<int*>& s1, set<int*>& s2, int a)
{
s1.insert(&a);
s2.insert(&a);
}
int main()
{
set<int*> s1, s2;
int a = 1, b = 2, c = 3, d = 4;
func(s1, s2, a);
func(s1, s2, b);
func(s1, s2, c);
func(s1, s2, d);
cout<<" s1.size = "<<s1.size()<<" s2.size = "<<s2.size()<<endl;
}
void func(set&s1,set&s2,int a)
{
s1.插入(&a);
s2.插入(&a);
}
int main()
{
设置s1、s2;
INTA=1,b=2,c=3,d=4;
func(s1,s2,a);
func(s1,s2,b);
func(s1,s2,c);
func(s1,s2,d);
cout&a
内部func
是局部参数a
的地址,而不是原始变量(a
、b
、c
或d
)的地址,其中:
可以在func
的不同调用之间获取各种类型的值
一旦到达声明a
的作用域的末尾(此处为func
的末尾),指针将变为无效指针
在您的情况下,由于您只需在一行中调用func
4次,因此此参数的地址不会发生更改,这就是为什么您的大小为1(插入相同的指针4次)
由于集合需要比较无效的指针,所以这种行为是错误的(感谢@Rakete1111)
通过s1
或s2
访问指向的元素(例如**s1.begin()
)是未定义的行为。参数a
通过值传递,这意味着您插入的是从参数复制的本地参数的地址。a
将在每次调用func
时构造,它们的地址可能相同或不同;没有任何保证
值得注意的是,参数a
在退出函数时将被销毁,然后插入的指针将被挂起
您应该通过引用传递,然后插入参数的地址(即main()
中的变量a
,b
,c
,d
),这些地址是不同的,不会挂在main()
的主体中
void func(set&s1、set&s2、int&a)
{
s1.插入(&a);
s2.插入(&a);
}
@Holt看起来像是。@Rakete1111谢谢,我不知道。我已经更新了答案。真的吗?3人认为这个问题应该结束,因为它“似乎与编程无关”?令人惊讶的是,GCC(g++-W-Wall-Wextra-Werror
)和Clang在没有任何警告的情况下编译了这段代码。@user200783“…在中定义的范围内。”这既不是“无法再复制的问题”也不是“简单的印刷错误”。投票重新开始。
void func(set<int*>& s1, set<int*>& s2, int& a)
{
s1.insert(&a);
s2.insert(&a);
}