#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 в вашем компиляторе.