符号在ideone上仍然存在,但在代码块上运行时带有警告
SIGILL on ideone but runs with warning on Codeblocks
我正在解决SPOJ上一个叫做FASHION的简单问题…它的简单。我只是想掌握迭代器的用法。但是我遇到了一个特殊的问题。
这是我的代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
int hotMax(vector<int> &, vector<int> &);
int main()
{
int iter,m_f;
scanf("%d", &iter);
vector<int> a,b;
while(iter--){
scanf("%d", &m_f);
a.resize(m_f);
b.resize(m_f);
vector<int>::iterator it;
for(it = a.begin(); it != a.end(); it++){
scanf("%d", it);
}
for(it = b.begin(); it != b.end(); it++){
scanf("%d", it);
}
printf("%dn", hotMax(a,b));
}
return 0;
}
int hotMax(vector<int> &a, vector<int> &b){
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
int result = 0;
vector<int>::iterator it1,it2;
for(it1 = a.begin(),it2 = b.begin(); it1 != a.end(); it1++,it2++){
result+= (*it1) * (*it2);
}
return result;
}
我在代码块上得到这个警告,
<>之前/home/harshal/c++ tutorial/SAMER08F/main.cpp|22|警告:格式' %d '期望参数类型为' int* ',但参数2的类型为' std::vector::iterator{也称为__gnu_cxx::__normal_iterator>}/home/harshal/c++ tutorial/SAMER08F/main.cpp|25|警告:格式' %d '期望参数类型为' int* ',但参数2的类型为' std::vector::iterator{又名__gnu_cxx::__normal_iterator>} ' [-Wformat=]|之前这些对应于scanf("%d", it);
但它在代码块中运行得很好,
给出了ideone和SPOJ上的SIGILL。
当我用cin>> *it
替换scanf时,它可以在SPOJ和ideone上完美运行。
scanf
和printf
是遗留的C函数,它们不应该与迭代器等c++功能结合使用。具体来说,std::vector<T>::iterator
是实现定义的,可能不仅仅是T*
,所以你不能依赖于对scanf
的调用是可移植的。
迭代器不一定是指针。因此这段代码产生了未定义的行为:
scanf("%d", it);
必须给scanf
一个int
变量的真实地址。如果您的实现碰巧将std::vector<int>::iterator
视为指针,那么您不会看到任何问题。
关于这个问题有一个真实的例子:
回到Visual Studio 6.0流行的时候,很多使用std::vector
的代码都假定向量迭代器是作为指针实现的,程序员是对的。那时的vector迭代器是用指针实现的。
VS 6.0之后出现了Visual Studio。vector迭代器不再被实现为一个简单的指针,因此许多遗留代码要么无法编译,要么在碰巧编译时被破坏。当您编写程序时依赖于实现细节时,就会发生这种情况。
相关文章:
- 我在c++代码中生成了一个运行时#3异常
- 为什么此代码存在运行时错误?
- C++程序打开时立即运行的代码
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- 蝴蝶代码 88.合并排序数组 c++ 运行时错误
- 在Hackerearth上获取运行时错误(SIGSEGV),无法找出代码中的问题
- 为什么我的代码在运行时保持循环
- 为什么我在此代码中收到运行时错误
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- LLvm Jit:如何从抖动代码中取消引用运行时指针?
- 与shared_ptr相比,更小的运行时数据结构和更快的代码可实现独特的_ptr
- 我的代码上的运行时错误 sigsegv
- 矢量的 c++ 代码中的运行时错误
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- C++/LLVM:运行时代码生成和STL容器
- 执行生成运行时代码的递归模板
- Netbeans C/C++ on Linux "step in to" Linux C 运行时代码?
- 用于将 C# 运行时代码编译为本机程序集代码(可从C++应用程序调用)中的.dll的方法
- Unix替代此mingw运行时代码
- 以0符号表示的运行时代码