数组的声明顺序如何改变输出?

时间:2019-07-04 19:32:29

标签: c++ arrays

我正在解决hackerrank问题https://www.hackerrank.com/challenges/icecream-parlor/problem。如果我先声明freq[],则所有测试用例都通过了,但是如果我先声明了arr[],则两个测试用例都失败了。谁能解释为什么?

#include <bits/stdc++.h>
using namespace std;
int freq[10004]; //This passes
int arr[10004];  //for all test cases
//int arr[10004]; but this fails
//int freq[10004]; for two test cases...why??

int main()
{
    int t;
    cin >> t;
    for (int i = 0; i < t; i++)
    {
        memset(freq, 0, sizeof(freq));
        int m, n, ansi, val;
        cin >> m >> n;
        for (int j = 0; j < n; j++)
        {
            cin >> arr[j];
            freq[arr[j]]++;
        }
        for (int j = 0; j < n; j++)
        {
            freq[arr[j]]--;
            if (freq[m - arr[j]] > 0)
            {

                ansi = j;
                val = m - arr[j];
                cout << j + 1;
                break;
            }
            freq[arr[j]]++;
        }
        for (int j = ansi + 1; j < n; j++)
        {
            if (val == arr[j])
            {
                cout << " " << j + 1 << endl;
                break;
            }
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

根据评论。这是一个简单的示例:

// Two arrays of size 10
int arr[10];
int freq[10];

// Write to freq filling it with 1's
for (int i = 0; i < 10; i++);
{
    freq[i] = 1;
}

// Write to arr filling it with 2'.... 
// but by mistake go wrote 11 times when the arr is only 10 long.
for (int i = 0; i < 11; i++);
{
    arr[i] = 2;
}

arr[10] = 2被写入哪里?

可能是freq在内存中的下一个位置,因此freq的第一个元素现在包含1。

或者可能是arr之后还有其他东西-我们不知道,有关内存包含的内容取决于编译器/链接器/ os。这就是为什么它称为未定义行为-它不受您控制。

例如在第一个循环之后:

         |arr----------------|freq---------------
Memory:   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 
Written:                      1 1 1 1 1 1 1 1 1 1

然后在第二个循环之后:

         |arr----------------|freq---------------
Memory:   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 
Written:  2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
                              ^
                        Over written the array

您可以通过一些绑定检查来发现问题:

for (int i = 0; i < 11; i++);
{
    if (i >= 0 && i < sizeof(arr))
    {
        arr[i] = 2;
    }
    else
    {
        std::cout << "Arr out of bounds at: " << i << std::endl;
    }
}