首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个c++代码在Dev c++上运行,而不是在网站上运行?

为什么这个c++代码在Dev c++上运行,而不是在网站上运行?
EN

Stack Overflow用户
提问于 2020-05-06 07:09:10
回答 2查看 1.5K关注 0票数 3

此代码接受整数数组的输入,其中1≤ai≤n (n =数组大小),一些元素出现两次,另一些元素出现一次。我们得把丢失的号码还回去。

投入: 4,3,2,7,8,2,3,1产出: 5,6

它在Dev C++中运行得很好,但是当我提交一个名为leetcode的网站时,它会给我以下错误

运行时错误消息:

第924行: Char 9:运行时错误:引用绑定到'int‘(stl_vector.h)类型的空指针摘要: UndefinedBehaviorSanitizer:未定义-行为UndefinedBehaviorSanitizer

代码语言:javascript
复制
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++,但是有人能告诉我为什么它不能在这个站点上工作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-06 07:30:12

它似乎只在Dev C++中工作得很好。正如其他编译器的错误消息所述,您的代码中有未定义的行为。杰斯珀有指针一号。另一条路线是:

代码语言:javascript
复制
if(nums[i]!=nums[i+1])

在上一次迭代期间,i等于len-1,因此nums[i+1]试图读取不存在的num[len]。您需要将循环更改为:

代码语言:javascript
复制
for(int i=0;i<len-1;i++)

第二个循环更难修复。您使用len作为限制,但它是nums的旧长度,您正在temp上迭代。此外,在此期间您将修改temp。您需要做的是在每次迭代之后检查temp的大小,并将i与当前的数字进行比较:

代码语言:javascript
复制
for(int i=0;i<temp.size();i++)

作为副词。有一些函数可以清除向量/在末尾添加元素。您可以找到完整的列表这里

票数 1
EN

Stack Overflow用户

发布于 2020-05-06 07:12:44

当您这样做时,向量temp是空的:

代码语言:javascript
复制
temp[j++]=nums[i];

因此,您正在访问超出范围的元素。这是未定义行为,您不能对结果抱有任何期望。什么事都有可能发生。一旦代码包含UB,编译器就不再有任何义务。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61629328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档