Инициализировать вектор указателей на указатели - PullRequest
0 голосов
/ 08 ноября 2018

У меня проблемы с инициализацией вектора указателей на указатели (что я не должен делать в любом случае, я думаю, но, пожалуйста, прости меня). У меня в основном есть указатель z на переменную, содержащую 0, и теперь я хочу инициализировать матрицу, которая содержит указатели на этот указатель.

void example(int nrow, int ncol) {
    int zero = 0;
    int* z = &zero;
    int size = nrow * ncol;
    vector<int **> pointerMatrix(size);
    for (int i = 0; i < size; i++) {
        int** a = &z;       
        pointerMatrix.push_back(a);
    }
    //following line throws an exception:
    cout << **pointerMatrix[0] << endl;
}

Теперь приведенный выше код вызывает исключение, очевидно, по адресу, на который указывает указатель, ничего не найдено.

Кто-нибудь видит мою ошибку?

Ответы [ 4 ]

0 голосов
/ 08 ноября 2018
vector<int **> pointerMatrix(size);

должно быть похоже на

vector<int **> pointerMatrix;

Похоже, что в вашей реализации есть опечатка, так как матрица указателей кажется уже размером до цикла. Вы должны либо вставить значение указателя в индекс, либо динамически выдвинуть это. Для этого я думаю, что объявление вектора pointerMatrix без определения размера должно работать.

0 голосов
/ 08 ноября 2018

Как описано в документации , pointerMatrix(size); создает вектор с size количеством инициализированных по умолчанию (nullptr) элементов, следовательно, после цикла ваш вектор содержит 2*size элементов,имея первую половину как nullptr, а вторую как реальные элементы, следовательно, cout << **pointerMatrix[0] << endl; пытается разыменовать a nullptr.

Чтобы это исправить, вы можете либо вызвать reserve, чтобы избежать ненужных перераспределений:

vector<int **> pointerMatrix;
pointerMatrix.reserve (size);

Или используйте operator[] для назначения значений вместо их нажатия:

for (int i = 0; i < size; i++) {
    int** a = &z;       
    pointerMatrix[i] = a; // Or pointerMatrix[i] = &z;
}
0 голосов
/ 08 ноября 2018

push_back используется для добавления нового элемента после конца вектора. Эффективно увеличивает размер вектора, чтобы добавить элемент в конце.

Вы уже указали размер вашего вектора, так что вы можете просто получить (и изменить) элементы с помощью operator[], например:

for (int i = 0; i < size; i++) {
    pointerMatrix[i] = &z;
}

В качестве альтернативы используйте цикл for на основе диапазона:

for (auto& entry : pointerMatrix) { // auto& can be replaced with int**&
    entry = &z;
}
0 голосов
/ 08 ноября 2018

Вы выделяете массив с желаемым размером, а затем все еще используете push_back для добавления дополнительных элементов в конце.

Поскольку вы намереваетесь заполнить весь массив одним и тем же элементом, вы должны использовать это:

vector<int **> pointerMatrix(size, &z);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...