c ++返回不同的结果

时间:2017-03-18 17:28:08

标签: c++ algorithm debugging return-value greedy

我发现我返回的参数在调用外部函数时与在本地函数中的参数不同。我在代码的每个部分设置了一些打印,但仍然不知道为什么不返回参数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

我对结果非常困惑。任何人都知道发生了什么事? 在此先感谢您的帮助!

1 个答案:

答案 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并且可以自由地产生垃圾输出。