我正在解决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;
}
答案 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;
}
}