我发现我返回的参数在调用外部函数时与在本地函数中的参数不同。我在代码的每个部分设置了一些打印,但仍然不知道为什么不返回参数i:
int assign_cookie(vector<int>& g, vector<int>& s){
if(s.size()==0 || g.size()==0){
cout << "size = 0, returning 0" << endl;
return 0;
}
cout << "s.size() = " << s.size() << endl;
cout << "g.size() = " << g.size() << endl;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
unsigned int i, j = 0;
while(i<g.size() && j<s.size()){
if(g[i]<=s[j]) i++;
j++;
}
cout << "(assign_cookie) i = " << i << endl;
return i;
}
当我在main函数中调用它时如下:
int main(){
int g[] = {1,2,3};
int s[] = {1,1};
vector<int> vg (g, g+3);
vector<int> vs (s, s+2);
int result = assign_cookie(vg,vs);
cout << "result = " << result << endl;
}
我得到的结果如下:
s.size() = 2
g.size() = 3
(assign_cookie) i = 1
(main) result = 0
我对结果非常困惑。任何人都知道发生了什么事? 在此先感谢您的帮助!
答案 0 :(得分:1)
您有未定义的行为,因为此处
unsigned int i,j=0;
您只是初始化j
而不是i
,然后在i
中使用g[i]
作为索引,而无需为其指定有意义的值。因此它是UB,任何事情都可能发生。实际上这是UB的一个有趣案例,就像你做的那样
unsigned int i,j=0;
std::cout << "i = " << i << "\n";
它仍会打印
i = 0
(assign_cookie) i = 1
result = 0
see also here。即使编译器似乎将i
初始化为0
,它仍然意识到存在UB并且可以自由地产生垃圾输出。