簡體   English   中英

在ideone上運行SIGILL,但在Codeblocks上運行警告

[英]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("%d\n", 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;
}

我在Code-blocks上收到此警告,

/home/harshal/c++ tutorial/SAMER08F/main.cpp|22|warning: format ‘%d’ expects argument of type ‘int*’, but argument 2 has type ‘std::vector::iterator {aka __gnu_cxx::__normal_iterator >}

/home/harshal/c++ tutorial/SAMER08F/main.cpp|25|warning: format ‘%d’ expects argument of type ‘int*’, but argument 2 has type ‘std::vector::iterator {aka __gnu_cxx::__normal_iterator >}’ [-Wformat=]|

這些對應於scanf("%d", it); 但它在代碼塊中完美運行,

它在ideone和SPOJ上給出了一個SIGILL。

當我用cin>> *it替換scanf cin>> *it ,它在SPOJ和ideone上完美運行。

如果你能給我一個洞察力,我將非常感激。 我試圖將放在scanf中,因為它是一種指向矢量的通用指針。

提前致謝。

scanfprintf是傳統的C函數,它們不應與迭代器之類的C ++功能結合使用。 具體來說, std::vector<T>::iterator是實現定義的,可能不僅僅是一個T* ,因此你不能依賴於scanf的可移植調用。

迭代器不一定是一個指針。 因此,此代碼產生未定義的行為:

scanf("%d", it);

你必須給scanf一個int變量的真實地址。 如果您的實現碰巧考慮使用std::vector<int>::iterator指針,那么您將看不到任何問題。

這個問題有一個真實的例子:

回到Visual Studio 6.0流行時,很多使用std::vector的代碼都假定向量迭代器是作為指針實現的,程序員是對的。 當時的向量迭代器被實現為指針。

然后是VS 6.0之后的Visual Studio。 向量迭代器不再被實現為一個簡單的指針,因此許多遺留代碼要么不編譯,要么在它們編譯時偶然被破壞。 當您在編寫程序時依賴實現細節時會發生這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM