带有向量的指针

时间:2018-06-23 06:57:41

标签: c++

有人可以告诉我,此代码有什么问题吗?目的是从给定的数字“ n”中查找因子。

vector <int> * factor(int *n){
    vector<int> * arr;
    for(int i=1;i<=*n;i++){
        if(*n%i==0){
            arr->push_back(i);
        }
    }
    return arr;
}
int main(){
    int n,j=0;
    vector<int> *arr;
    cin>>n;
    arr = factor(&n);
    for(auto it=arr->begin();it!=arr->end();++it){
        cout<<*it;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的第一个问题是将局部变量的地址传递给希望读取该地址内容的函数。您尚未为该变量分配内存,因此它是一个“临时”变量,它存储在堆栈中,而不是堆中,因此factor无法访问它。 如果您觉得不必要分配内存,则应将n定义为指针,使用“ new”分配内存,然后将指针传递给factor,如下所示:

int* n = new int;
arr = factor(n);

但是,您可以轻松地按原样传递因数,因此它将收到它的副本。这要求您编辑函数并从n中删除*。

您的第二个问题是将arr定义为向量的指针。它所做的只是创建一个变量,该变量说:“嘿,我可以将您指向真正的矢量对象所在的方向!”,但是没有这样的对象,因为您尚未为其分配内存。

对于此代码,最好使用局部变量,这里不需要分配内存,因此我建议进行以下编辑:

vector <int>  factor(int n){
    vector<int>  arr;
    for(int i=1;i<=n;i++){
        if(n%i==0){
            arr.push_back(i);
        }
    }
    return arr;
}
int main(){
    int n,j=0;
    vector<int> arr;
    cin>>n;
    arr = factor(n);
    for(auto it=arr.begin();it!=arr.end();++it){
        cout<<*it;
    }
    return 0;
}