передача векторного указателя на функцию вызывает ошибку segfault

#c #pointers #vector #segmentation-fault

#c #указатели #вектор #ошибка сегментации

Вопрос:

Я передаю векторный указатель другой функции, которая передает данные, используя этот указатель:

 void foo(vector<pair<int,int>> * vp){
 vp->push_back(pair<int,int>(1,1)); //causes segfault
}

void bar(vector<pair<int,int>> *vp = NULL){
  foo(vp);
}
  

Push_back вызывает ошибку segfault.

Комментарии:

1. И вы вызвали bar как? Что сказал ваш отладчик?

2. Передайте вектор по ссылке. Тогда оно никогда не может быть NULL.

Ответ №1:

Если вы вызываете bar без параметра, то vp будет NULL . Затем foo передается NULL указатель, и, таким образом, эта инструкция vp->push_back сгенерирует ошибку сегментации.

Комментарии:

1. Как мне установить векторный указатель по умолчанию, не присваивая значение NULL в bar()? Потому что в первый раз, когда я передаю векторный указатель foo(), он будет пустым / NULL.

2. Вы выделяете его перед использованием или, в идеале, если вам действительно не нужен указатель, вы используете ссылку, как предложил Нил.

Ответ №2:

Если это причиняет боль, не делайте этого. Вы почти никогда не должны передавать такие вещи, как векторы, используя указатели — вместо этого используйте ссылки:

 void foo(vector<pair<int,int>> amp; vp){
 vp.push_back(pair<int,int>(1,1));
}
  

Комментарии:

1. согласен, передача по ссылке в целом является лучшим решением

2. Я не согласен; использование неконстантных ссылок — плохой стиль, поскольку, глядя на код, вы не можете догадаться, что передаваемый вами параметр является изменяемым.

Ответ №3:

Я предполагаю, что ваш вектор равен NULL … вы захотите добавить проверку в foo .

 void foo(vector<pair<int,int>> * vp)
{
    if (vp != NULL)
        vp->push_back(pair<int,int>(1,1));
}
  

Также предпочитайте использовать nullptr , если у вас есть поддержка C 0x в вашем компиляторе.