为什么这个 c++ 代码 运行 在 Dev c++ 而不是在网站上?
why does this c++ code run on Dev c++ but not on a website?
此代码接受整数数组的输入,其中 1 ≤ a[i] ≤ n(n = 数组大小),一些元素出现两次,其他元素出现一次。我们必须 return 缺失的数字。
输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
它在 Dev C++ 中工作得很好,但是当我将它提交到一个名为 leetcode 的网站时,它给了我以下错误
运行时错误消息:
Line 924: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer:
undefined-behavior
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/stl_vector.h:933:9
vector<int> findDisappearedNumbers(vector<int>& nums)
{
vector<int> temp;
const int len = nums.size();
int j=0;
//sorted the array
sort(nums.begin(), nums.end());
//Added non-repetitive numbers into a temp vector
for(int i=0;i<len;i++)
{
if(nums[i]!=nums[i+1])
{
temp[j++]=nums[i];
}
}
//cleared nums vector for later use
nums.erase(nums.begin(), nums.end());
//added missing numbers in the sequence to both temp and nums vectors
for(int i=0;i<len;i++)
{
if(temp[i]!=i+1)
{
temp.insert(temp.begin()+i, i+1);
nums.insert(nums.end(),i+1);
}
}
return nums;
}
我知道这段代码效率低下,我刚开始使用 C++,但有人能告诉我为什么它在网站上不起作用吗?
执行此操作时,您的矢量 temp
为空:
temp[j++]=nums[i];
所以你正在越界访问元素。那是 undefined behaviour,您不能对结果有任何期望。 任何事情 都可能发生。一旦您的代码包含 UB,编译器就不再没有义务。
它似乎只在 Dev C++ 中运行良好。正如其他编译器的错误消息所说,您的代码中有未定义的行为。 Jesper 有一个指针。
另一个是行:
if(nums[i]!=nums[i+1])
在最后一次迭代中 i
等于 len-1
,因此 nums[i+1]
尝试读取不存在的 num[len]
。
您需要将循环更改为:
for(int i=0;i<len-1;i++)
第二个循环有点难修复。您正在使用 len
作为限制,但它是 nums
的旧长度并且您正在迭代 temp
。此外,您在此期间正在修改 temp
。您需要做的是在每次迭代后检查 temp
的大小,并将 i
与当前数字进行比较:
for(int i=0;i<temp.size();i++)
作为旁注。有一些函数可以清除向量/在末尾添加一个元素。您可以找到完整列表 here.
此代码接受整数数组的输入,其中 1 ≤ a[i] ≤ n(n = 数组大小),一些元素出现两次,其他元素出现一次。我们必须 return 缺失的数字。
输入: [4,3,2,7,8,2,3,1] 输出: [5,6]
它在 Dev C++ 中工作得很好,但是当我将它提交到一个名为 leetcode 的网站时,它给了我以下错误
运行时错误消息:
Line 924: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/stl_vector.h:933:9
vector<int> findDisappearedNumbers(vector<int>& nums)
{
vector<int> temp;
const int len = nums.size();
int j=0;
//sorted the array
sort(nums.begin(), nums.end());
//Added non-repetitive numbers into a temp vector
for(int i=0;i<len;i++)
{
if(nums[i]!=nums[i+1])
{
temp[j++]=nums[i];
}
}
//cleared nums vector for later use
nums.erase(nums.begin(), nums.end());
//added missing numbers in the sequence to both temp and nums vectors
for(int i=0;i<len;i++)
{
if(temp[i]!=i+1)
{
temp.insert(temp.begin()+i, i+1);
nums.insert(nums.end(),i+1);
}
}
return nums;
}
我知道这段代码效率低下,我刚开始使用 C++,但有人能告诉我为什么它在网站上不起作用吗?
执行此操作时,您的矢量 temp
为空:
temp[j++]=nums[i];
所以你正在越界访问元素。那是 undefined behaviour,您不能对结果有任何期望。 任何事情 都可能发生。一旦您的代码包含 UB,编译器就不再没有义务。
它似乎只在 Dev C++ 中运行良好。正如其他编译器的错误消息所说,您的代码中有未定义的行为。 Jesper 有一个指针。 另一个是行:
if(nums[i]!=nums[i+1])
在最后一次迭代中 i
等于 len-1
,因此 nums[i+1]
尝试读取不存在的 num[len]
。
您需要将循环更改为:
for(int i=0;i<len-1;i++)
第二个循环有点难修复。您正在使用 len
作为限制,但它是 nums
的旧长度并且您正在迭代 temp
。此外,您在此期间正在修改 temp
。您需要做的是在每次迭代后检查 temp
的大小,并将 i
与当前数字进行比较:
for(int i=0;i<temp.size();i++)
作为旁注。有一些函数可以清除向量/在末尾添加一个元素。您可以找到完整列表 here.