2016-09-26 6 views
-2

Я тестировал std::unordered_map s, чтобы привыкнуть к ним, прежде чем использовать их в проекте.Ошибка сегментации, когда указатель используется как ключевой момент для чего-то в std :: unordered_map

И я заметил, что если я использую указатели в качестве ключей, я получаю ошибку segfault, когда указатель, используемый в качестве ключа, фактически указывает на значение. Это мой код:

#include <unordered_map> 
#include <stdio.h> 

int main() { 
    std::unordered_map<int*, int> map; 

    int* key; 
    //*key = 18; 

    map[key] = 1893; 

    printf("%d\n", map[key]); 
} 

Теперь, если я раскомментировать эту комментируемую строку, я получаю ошибку ошибки сегментации, в то время как, если я оставлю это commmented, все работает отлично. Почему это происходит?

+1

вы забыли выделить память для указателя. 'int * key = new int' – PRP

+0

Отмеченные строки разделяют неинициализированный указатель, как вы ожидаете, что это сработает? –

+0

Посмотрите на это [руководство по указателям] (http://www.cplusplus.com/doc/tutorial/pointers/). Это объясняет все, что вам нужно знать, почему это не сработает. – muXXmit2X

ответ

1

Вы указали указатель, а не int. Указатель указывает на никуда, поскольку вы не инициализировали его. Нельзя писать 18, потому что указатель не указывает на какое-либо пространство.

Обратите внимание, что ваша проблема полностью не связана с неупорядоченными картами.
int * key; *key = 18; сбрасывает в любом контексте.

Используйте либо
int key; key = 18;,
или, если вы действительно хотите key быть указателем:
int * key = new int; key = 18;

 Смежные вопросы

  • Нет связанных вопросов^_^